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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

P6669 [清华集训2016] 组合数问题

發(fā)布時(shí)間:2023/12/3 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P6669 [清华集训2016] 组合数问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

P6669 [清華集訓(xùn)2016] 組合數(shù)問(wèn)題

題意:

給你n,m,k,問(wèn)有多少對(duì)(i,j)滿足K∣CijK|C_{i}^{j}KCij?
(Cij是k的倍數(shù)C_{i}^{j}是k的倍數(shù)Cij?k數(shù))
n,m<=1e18

題解:

n和m非常大,非常非常大,很容易想到用盧卡斯來(lái)化簡(jiǎn)
Cnmmodp=Cn/pm/p?Cn%pm%pC_{n}^{m}\bmod p=C_{n/p}^{m/p}*C_{n\%p}^{m\%p}Cnm?modp=Cn/pm/p??Cn%pm%p?

對(duì)于i%p的范圍就會(huì)很小,但是i/p的范圍有可能還是很大,所以將Ci/pj/pC_{i/p}^{j/p}Ci/pj/p?繼續(xù)用盧卡斯化簡(jiǎn)。

這樣一直操作,n/p,取n%p,然后再n/p…,這不就相當(dāng)于是將n轉(zhuǎn)化成p進(jìn)制嗎?可以好好思考一下
最后式子變成:Cnmmodp=∏i=0kCnimiC_{n}^{m}\bmod p=\prod_{i=0}^{k}C_{n_{i}}^{m_{i}}Cnm?modp=i=0k?Cni?mi??
n=nk?pk+nk?1?pk?1+...+n0n=n_{k}*p^{k}+n_{k-1}*p^{k-1}+...+n_{0}n=nk??pk+nk?1??pk?1+...+n0?
m同理

如果CnmC_{n}^{m}Cnm?是k的倍數(shù),說(shuō)明CnmmodpC_{n}^{m}\bmod pCnm?modp等于0,也就是那個(gè)累乘為0,就說(shuō)明存在某一項(xiàng)Cnimi=0C_{ni}^{mi}=0Cnimi?=0

現(xiàn)在我們開(kāi)始考慮CnimiC_{ni}^{mi}Cnimi?的情況,如何求其數(shù)量,我們可以先求出所有組合數(shù)C的情況,然后減去C非0的情況,那么剩下的就是C為0的情況
所有組合數(shù)C的情況就是(m+1)?(m+2)/2+(n?m)?(m+1)(m+1)*(m+2)/2+(n-m)*(m+1)(m+1)?(m+2)/2+(n?m)?(m+1),這個(gè)很好推,寫(xiě)出式子就有了

那C非0的情況如何求?
用數(shù)位dp來(lái)做,設(shè)dp[i][j][k]:表示考慮第i位,j和k為0或1,j為1表示第i-1位n已經(jīng)取上界(本位取值存在限制),k為1表示第i-1位m取上界。為0則表示未取上界(本位取值無(wú)限制)
當(dāng)?shù)趇位n不取上屆時(shí),第i位之后的每一位就可以隨便取,一定會(huì)小于(數(shù)位dp思想)
詳細(xì)看代碼

代碼:

// Problem: P6669 [清華集訓(xùn)2016] 組合數(shù)問(wèn)題 // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P6669 // Memory Limit: 500 MB // Time Limit: 1000 ms // Data:2021-08-27 14:38:38 // By Jozky#include <bits/stdc++.h> #include <unordered_map> #define debug(a, b) printf("%s = %d\n", a, b); using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> PII; clock_t startTime, endTime; //Fe~Jozky const ll INF_ll= 1e18; const int INF_int= 0x3f3f3f3f; void read(){}; template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar) {x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...); } template <typename T> inline void write(T x) {if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0'); } void rd_test() { #ifdef LOCALstartTime= clock();freopen("in.txt", "r", stdin); #endif } void Time_test() { #ifdef LOCALendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC); #endif } int t, k; const ll mod= 1e9 + 7; const int maxn= 2000; int b[maxn]; int c[maxn]; int cnt1= 0; int cnt2= 0; int f[maxn][2][2]; ll Sum(ll a, ll b) {ll ans= 0;while (b) {if (b & 1)ans= (ans + a) % mod;a= (a + a) % mod;b>>= 1;}return ans % mod; } ll poww(ll a, ll b) {ll ans= 1ll;while (b) {if (b & 1)ans= Sum(ans, a) % mod;a= Sum(a, a) % mod;b>>= 1;}return ans % mod; } ll solve(int len, int nup, int mup) //數(shù)位dp {if (!len)return 1;if (f[len][nup][mup] != -1)return f[len][nup][mup] % mod;ll ans= 0;int l, r;//如果上一位到了上界,本位取值范圍是0到b[len]//如果上一位沒(méi)有到上界,本位就可以隨便取值,范圍是0到k-1l= nup ? b[len] : k - 1;r= mup ? c[len] : k - 1;for (int i= 0; i <= l; i++) {for (int j= 0; j <= i && j <= r; j++) {ans= (ans + solve(len - 1, nup && (i == l), mup && (j == r))) % mod;}}return f[len][nup][mup]= ans % mod; } int main() {//rd_test();read(t, k);while (t--) {ll n, m;scanf("%lld%lld", &n, &m);cnt1= 0;cnt2= 0;memset(f, -1, sizeof(f));memset(b, 0, sizeof(b));memset(c, 0, sizeof(c));m= min(n, m);ll sum= ((((((m + 1) % mod * ((m + 2) % mod)) % mod) * (poww(2ll, mod - 2) % mod)) % mod) + (((n - m) % mod) * ((m + 1) % mod)) % mod) % mod;//cout << "sum=" << sum << endl;ll P= mod;while (n) {b[++cnt1]= n % k;n/= k;}while (m) {c[++cnt2]= m % k;m/= k;}printf("%lld\n", (sum - solve(cnt1, 1, 1) + mod) % mod);}//Time_test(); }

總結(jié)

以上是生活随笔為你收集整理的P6669 [清华集训2016] 组合数问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。