日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

无题8

發布時間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 无题8 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題解:

第一題:開始想找循環節,但數據很好卡; 后來想小的一直拿,那么另一個就會出現負數,抵消+打表發現就是2^k在mod(n+m)的值;

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll mod, n, m;ll ksm(ll a, ll b){ll ret = 1;for(; b; b >>= 1, a=a*a%mod)if(b&1) ret=ret*a%mod;return ret;
}int main(){freopen("sesame.in","r",stdin);freopen("sesame.out","w",stdout);ll k;cin>>n>>m>>k;mod = n + m;if(n > m) swap(n, m);ll ans = ksm(2, k);n = ans * n % mod;cout<<min(n, mod - n)<<endl;
} 
View Code

?

第二題:,Ax % Ay = k ==> ?Ax - k = n * Ay; 只需要判斷(Ax - k)是否整除Ay即可,

ai <= 1e5;?利用這個性質想到拆分,?把Ax的因子都分解出來,如果他包含Ay,就記錄一個max(now, lst),往后掃;

O(n√n)

#include<bits/stdc++.h>
using namespace std;const int M = 1e5 + 10;
#define ll long long
int lst[M], a[M], k;
void divi(int x, int pos){for(int i = 1; i * i <= x; i++)if(x % i == 0) lst[i] = lst[x / i] = pos;
}int main(){freopen("drink.in","r",stdin);freopen("drink.out","w",stdout);int n, now = 0;ll ans = 0;scanf("%d%d", &n, &k);for(int i = 1; i <= n; i++) scanf("%d", &a[i]);for(int i = 1; i <= n; i++){if(a[i] > k){now = max(now, lst[0]);now = max(lst[a[i]], now);}  ans = ans + 1LL*(i - now);if(a[i] - k >= k) divi(a[i] - k, i);else if(a[i] == k) lst[0] = i;//printf("%d %d\n ", now, i);
    }printf("%lld\n", ans);
} 
View Code

?

第三題:利用ai<=5000 的性質,搞一個(ai^2), 題解附在代碼中

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int M = 5005;
int f[M][M], a[1000005];
ll d[2][M], fac[M], P[M], mod;int main(){freopen("kalanchoe.in","r",stdin);freopen("kalanchoe.out","w",stdout);int n, m;scanf("%d%d%lld", &n, &m, &mod);for(int i = 1; i <= n; i++)scanf("%d", a + i);f[1][1] = 1; for(int i = 2; i <= 5000; i++)for(int j = 1; j <= 5000; j++)f[i][j] = ((ll)f[i - 1][j - 1] + (ll)f[i - 1][j] * (j - 1) % mod ) % mod;//f[i][j] 表示有i個空位放j個顏色的方案數,可以選擇放一個新的顏色或者原來的顏色 fac[0] = 1;     P[1] = m;for(int i = 1; i <= 5000; i++) fac[i] = fac[i - 1] * i % mod;for(int i = 2; i <= 5000; i++) P[i] = P[i - 1] * (m - i + 1) % mod;   // 排列 for(int i = 1; i <= a[1]; i++) d[1][i] = (ll)f[a[1]][i] * P[i] % mod; //d[i][j]表示第i行放j種顏色的方案數,f只確定了位置,放什么顏色排列 int u = 1;for(int i = 2; i <= n; i++){u ^= 1;ll sum = 0;for(int j = 1; j <= a[i - 1]; j++) sum = (sum + d[u^1][j]) % mod;for(int j = 1; j <= a[i]; j++) {d[u][j] = (ll)f[a[i]][j] * P[j] % mod * sum % mod; //該行放j個的總方案數要乘上上一行的總方案數; if(j <= a[i - 1]) d[u][j] = ((d[u][j] - (ll)f[a[i]][j] * d[u^1][j] % mod * fac[j] % mod) + mod) % mod;//如果放的顏色比上一行總顏色種類少,那么可能會和上行顏色集合重復,我們強制這j種顏色和上行j種顏色同,怎么放就乘上fac[j] 
        }}ll ans = 0;for(int i = 1; i <= a[n]; i++) ans = (ans + d[u][i]) % mod;printf("%lld\n", ans);
} 

?

轉載于:https://www.cnblogs.com/EdSheeran/p/9707885.html

總結

以上是生活随笔為你收集整理的无题8的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。