國家發改委就“負面清單”徵求意見:將虛擬貨幣“挖礦”活動列入淘汰類
阿新 • • 發佈:2021-10-08
Link.
Description.
有一個函式 \(f(S)\) 表示當狀態為 \(S\) 的投票狀態是 \(1\) 贏還是 \(2\) 贏。
現在每個人等概率隨機一個 ABC
的排列表示三個候選人的優先順序。
進行三輪大選,問存在一個人贏了兩局的概率。
保證 \(f(S)=f(T\oplus S)\),\(T\) 表示全集。
Solution.
首先 A,B,C
本質相同,可以答案 \(\times 3\) 然後算 A
win 的概率。
A
如果 win 了,考慮設第一次關於 A
的大選結果狀態是 \(A\),第二次是 \(B\)。
則有 \(f(A)=f(B)=1\)
考慮每位貢獻,如果 \(A\) 的第 \(i\) 位和 \(B\) 的第 \(i\) 位相同,則有兩種不同的選法(比如
ABC
和 ACB
),否則一種。發現是
XOR
,直接 FWT
即可。
Coding.
點選檢視程式碼
//是啊,你就是那隻鬼了,所以被你碰到以後,就輪到我變成鬼了{{{ #include<bits/stdc++.h> using namespace std;typedef long long ll; template<typename T>inline void read(T &x) { x=0;char c=getchar(),f=0; for(;c<48||c>57;c=getchar()) if(!(c^45)) f=1; for(;c>=48&&c<=57;c=getchar()) x=(x<<1)+(x<<3)+(c^48); f?x=-x:x; } template<typename T,typename...L>inline void read(T &x,L&...l) {read(x),read(l...);}//}}} const int N=1048577,P=1e9+7;int n,a[N];char ch[N]; inline void FWT(int n,int *a,int fg) { for(int d=1;d<n;d<<=1) for(int i=0;i<n;i+=(d<<1)) for(int j=0;j<d;j++) {int x=a[i+j],y=a[i+j+d];a[i+j]=1ll*(x+y)*fg%P,a[i+j+d]=1ll*(x-y+P)*fg%P;} } inline int bit(int x) {int rs=0;for(;x;rs+=(x&1),x>>=1);return rs;} int main() { read(n),scanf("%s",ch); for(int i=0;i<(1<<n);i++) a[i]=ch[i]^48; FWT(1<<n,a,1);for(int i=0;i<(1<<n);i++) a[i]=1ll*a[i]*a[i]%P; FWT(1<<n,a,(P+1)>>1);int rs=0; for(int i=0;i<(1<<n);i++) rs=(rs+(1ll<<(n-bit(i)))*a[i])%P; return printf("%lld\n",rs*3ll%P),0; }