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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Codeforces.449D.Jzzhu and Numbers(容斥 高维前缀和)

發布時間:2023/12/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces.449D.Jzzhu and Numbers(容斥 高维前缀和) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

\(Description\)

給定\(n\)個正整數\(a_i\)。求有多少個子序列\(a_{i_1},a_{i_2},...,a_{i_k}\),滿足\(a_{i_1},a_{i_2},...,a_{i_k}\) \(and\)起來為\(0\)
\(n\leq10^6,\quad 0\leq a_i\leq10^6\)

\(Solution\)

這個數據范圍。。考慮按位容斥:
\(g_x\)表示\(x\)的二進制表示中\(1\)的個數,\(f_x\)表示有多少個\(a_i\)滿足\(a_i\&x=x\)
想要讓選出來的子序列最終\(and\)和為\(x\),那么只能從這\(f_x\)個數中選。
所以\(Ans=\sum_{x=0}^{lim}(-1)^{g_x}(2^{f_x}-1)\)

那么如何求\(f_x\)
\(a_i\&x=x\),即\(x\)\(a_i\)的子集,所以對\(f_x\)枚舉超集更新即可。復雜度\(O(2^nn)\)

注意因為寫法問題數組要開兩倍。

又一不小心一個rank1...

//62ms 35500KB #include <cstdio> #include <cctype> #include <algorithm> #define MAXIN 500000 #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++) #define mod 1000000007 #define lb(x) (x&-x) #define Add(x,v) (x+=v)>=mod&&(x-=mod) typedef long long LL; const int N=3e6+5;int bit[N],pw[N],f[N]; char IN[MAXIN],*SS=IN,*TT=IN;inline int read() {int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now; }int main() {int n=read(),lim=0;for(int t,i=1; i<=n; ++i) ++f[t=read()],lim=std::max(lim,t);pw[0]=1;for(int i=1; i<=n; ++i) pw[i]=pw[i-1]<<1, pw[i]>=mod&&(pw[i]-=mod);for(int i=0; 1<<i<=lim; ++i)for(int s=0; s<=lim; ++s)if(!(s>>i&1)) Add(f[s],f[s|(1<<i)]);LL ans=0;for(int i=1; i<=lim; ++i) bit[i]=bit[i^lb(i)]^1;for(int i=0; i<=lim; ++i) ans+=bit[i]?mod-pw[f[i]]+1:pw[f[i]]-1;printf("%I64d\n",ans%mod);return 0; }

轉載于:https://www.cnblogs.com/SovietPower/p/10073986.html

總結

以上是生活随笔為你收集整理的Codeforces.449D.Jzzhu and Numbers(容斥 高维前缀和)的全部內容,希望文章能夠幫你解決所遇到的問題。

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