zoukankan      html  css  js  c++  java
  • CF850E Random Elections 题解

    Codeforces
    Luogu

    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\) 位相同,则有两种不同的选法(比如 ABCACB),否则一种。
    发现是 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;
    }
    
  • 相关阅读:
    使用 Windows XP 的两种强大的工具在您的代码中检测并堵塞 GDI 泄漏
    SystemParametersInfo
    SQL bcp命令详解
    不同版本操作系统和数据库的之间链接,和操作
    js添加删除行和双击变文本框
    MYSQL 日志问题
    循环文件夹下的文件
    php导出数据到EXCEL
    配置Apache服务器的二级域名支持
    每天读一遍,坚持30天,和老外交流没问题!
  • 原文地址:https://www.cnblogs.com/pealfrog/p/15399750.html
Copyright © 2011-2022 走看看