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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【启智树NOIP模拟】奇偶【卢卡斯定理】【背包】【bitset】

發布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【启智树NOIP模拟】奇偶【卢卡斯定理】【背包】【bitset】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:給定 nnn 個數 aia_iai? ,求選出(可以重復,考慮順序)MMM 個數和為 SSS 的方案數模 222

n≤200,ai≤105,M,S≤1018n\leq 200,a_i\leq 10^5,M,S\leq 10^{18}n200,ai?105,M,S1018

首先給每個數分配一個出現次數 cic_ici?,這個 ccc 貢獻的方案數為

M!c1!c2!…cn!\frac{M!}{c_1!c_2!\dots c_n!}c1?!c2?cn?!M!?

(Mc1)(M?c1c2)(M?c1?c2c3)…\binom{M}{c_1}\binom{M-c_1}{c_2}\binom{M-c_1-c_2}{c_3}\dots(c1?M?)(c2?M?c1??)(c3?M?c1??c2??)

寫出 M,ciM,c_iM,ci? 的二進制,發現上式為奇數當且僅當 c1∣c2∣c3…∣cn=Mc_1|c_2|c_3\dots|c_n=Mc1?c2?c3?cn?=M

證明:考慮模 222 意義下的盧卡斯定理,對于組合數 (ab)\binom{a}{b}(ba?),該式為 000 當且僅當二進制某個對應位置 aaa000bbb111。也就是說,整個式子為 111 當且僅當每個組合數下面都是上面的子集。通過歸納法就可以證明。

如果想找個沒這么啟發式的證明,可以考慮對于 222ruler?(x)=2x?count?(x)\operatorname{ruler}(x)=2x-\operatorname{count}(x)ruler(x)=2x?count(x)

這意味著:對于 MMM 每一個為 111 的位 iii,都可以且必須選 2i2^i2i 個相同的數。

所以從高到底考慮 SSS 的每一位做個背包,設 f(i,j)f(i,j)f(i,j) 表示考慮到第 iii 位剩下 jjj 的空間的方案數,每枚舉一位就把這個空間乘以 222 加上這一位的數。因為 aia_iai? 只有 10510^5105,所以這個 jjj 不用記太大,用 bitset 優化即可。

復雜度 O(Tnailog?S/w)O(T na_i\log S /w)O(Tnai?logS/w)

#include <iostream> #include <cstdio> #include <cstring> #include <cctype> #include <bitset> using namespace std; typedef long long ll; const int N=2e5; int a[205]; bitset<N+5> f[2]; int main() {int T;scanf("%d",&T);while (T--){ll M,S;int n;scanf("%lld%lld%d",&M,&S,&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]);f[0].reset(),f[1].reset();f[0].set(0);for (int d=60;d>=0;d--){f[1].reset();for (int i=0;((i<<1)|((S>>d)&1))<=N;i++) if (f[0][i]) f[1].set((i<<1)|((S>>d)&1));f[0]=f[1];if ((M>>d)&1){f[0].reset();for (int i=1;i<=n;i++) f[0]^=(f[1]>>a[i]);} else f[0]=f[1];}cout<<f[0][0]<<'\n';}return 0; }

總結

以上是生活随笔為你收集整理的【启智树NOIP模拟】奇偶【卢卡斯定理】【背包】【bitset】的全部內容,希望文章能夠幫你解決所遇到的問題。

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