1. 程式人生 > >bzoj4903 [Ctsc2017]吉夫特

bzoj4903 [Ctsc2017]吉夫特

滿足 choose .com mod %d mage cpp play n)

技術分享圖片



搞了半天這個東西要用 Lucas 定理啊。。。
技術分享圖片

學好這些姿勢你就可以A了。。。
顯然:
\[{0 \choose 1}=0\ \ \ {1 \choose 1}=1\ \ \ {1 \choose 0}=1\ \ \ {0 \choose 0}=1\]
你一直用這個 Lucas 定理,又因為 mod = 2, 實際上就是把兩個二進數數挨著挨著一位一位的比較。
所以你只要在過程中沒有 \({0 \choose 1}\) 就好了。
在進一步就成了 \(n & m = m\) 就滿足了。
你 dp 自己枚舉一下豈不是很完美?


#include<bits/stdc++.h>
using
namespace std; const int maxn = 234567, mod = 1e9 + 7; int n, ans, ini[maxn], lpl[maxn], pw[63]; inline void prepare() { pw[1] = 1; for(int i = 2; i <= 20; ++i) pw[i] = pw[i - 1] * 2; } int main() { prepare(); scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("
%d", &ini[i]); for(int now, i = n; i >= 1; --i){ now = ini[i]; lpl[ini[i]] = 1; for(int j = now; j; ){ j = (j - 1) & now; lpl[ini[i]] = (lpl[ini[i]] + lpl[j]) % mod; } } for(int i = 1; i <= n; ++i) ans = (ans + lpl[ini[i]]) % mod; cout << ans - n; return
0; }

bzoj4903 [Ctsc2017]吉夫特