CF850E Random Elections
题意:一共有n个人,要在三个人中选prefer,一开始他们心中都会想好他们的排名(共6种),之后给出的判断不会矛盾。规则如下:一共有三轮,分别是a->b,b->c,c->a,每个人选1,表示prefer前者,选0表示prefer后者。这样形成一个n位的二进制x。定义函数f(x)={0,1}:1表示这一轮中前者赢,0表示后者赢。
有性质:f(x^((1<<n)-1))=1-f(x)。
现在给出f的对应值表,问其中一个人完胜(赢>=2局)的概率*6^n?n<=20。
标程:
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+;
typedef long long ll;
const int N=;
int n;
ll ans,f[N],x[N];
void fwt()
{
for (int i=;i<n;i++)
for (int j=;j<(<<n);j++)
if (!(j&(<<i)))
{
ll l=f[j],r=f[j|(<<i)];
f[j]=l+r,f[j|(<<i)]=l-r;
}
}
int main()
{
scanf("%d",&n);char c=getchar();
while (c<''||c>'') c=getchar();
for (int i=;i<(<<n);i++) f[i]=c-'',c=getchar();
fwt();
for (int i=;i<(<<n);i++) f[i]=f[i]*f[i];
fwt();
for (int i=;i<(<<n);i++) f[i]=f[i]>>n;
x[]=;
for (int i=;i<(<<n);i++) x[i]=x[i>>]<<(i&);//递推求2^popcount(i)
for (int i=;i<(<<n);i++)
ans=((ll)ans+(ll)f[i]*x[i^((<<n)-)]%mod)%mod;
printf("%d\n",(ll)ans*%mod);
return ;
}
易错点:1.有一点地方少开ll了啊啊啊。低级错误。
题解:fwt
写fwt的时候用a[i^j]=sigma(b[i]*c[j])来理解比较容易。
举其中一个人来看,设有关其的两轮他都赢(以下称作A,B),即有一个0一个1的结果(与题目中国的顺序对应)。(最后方案数*3,有三个人)
不能让喜爱排名矛盾,那么我们可以在A,B轮中任意,由此第三轮一些位置固定,一些位置不固定l个,*2^l即可。
运用题目中给的性质,一个0一个1的结果不好处理,但可以与两个1的情况通过一次取反唯一对应。于是可以用fwt统计方案数。由于是按位异或,答案下标的二进制表示中有几个0,即是有几个数不固定。
CF850E Random Elections的更多相关文章
- CF850E Random Elections 题解
题目传送门 题目大意 没法描述,过于繁杂. 思路 果然自己是个菜鸡,只能靠读题解读题,难受极了,其实不是很难自己应该做得出来的....哎.... 不难发现可以统计 \(A\) 获胜的情况乘上 \(3\ ...
- 【CF850E】Random Elections(FWT)
[CF850E]Random Elections(FWT) 题面 洛谷 CF 题解 看懂题就是一眼题了... 显然三个人是等价的,所以只需要考虑一个人赢了另外两个人就好了. 那么在赢另外两个人的过程中 ...
- 【CF850E】Random Elections FWT
[CF850E]Random Elections 题意:有n位选民和3位预选者A,B,C,每个选民的投票方案可能是ABC,ACB,BAC...,即一个A,B,C的排列.现在进行三次比较,A-B,B-C ...
- [Codeforces]850E - Random Elections
FWT裸题,写了下模板 #include<cstdio> #define ll long long #define r register int #define MN (1<< ...
- codeforces850E Random Elections
题目链接:codeforces 850E 翻译:luogu 读题是第一要务(大选这么随便真的好吗) 其实答案问你的就是在所有选民心中支持的人的所有情况中,能让一个人连赢两场的情况数是多少 我们假设\( ...
- CF850 E. Random Elections
题目传送门:CF 题目大意: 现有\(A,B,C\)三人参加竞选,有n个市民对其进行投票,每个市民心中对三人都有一个优先顺序(如市民\(i\)对三人的优先顺序为\(A-C-B\),则凡是有\(A\)的 ...
- Chrome V8引擎系列随笔 (1):Math.Random()函数概览
先让大家来看一幅图,这幅图是V8引擎4.7版本和4.9版本Math.Random()函数的值的分布图,我可以这么理解 .从下图中,也许你会认为这是个二维码?其实这幅图告诉我们一个道理,第二张图的点的分 ...
- Math.random()
Math.random() 日期时间函数(需要用变量调用):var b = new Date(); //获取当前时间b.getTime() //获取时间戳b.getFullYear() //获取年份b ...
- .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数
.Net中我们通常使用Random类生成随机数,在一些场景下,我却发现Random生成的随机数并不可靠,在下面的例子中我们通过循环随机生成10个随机数: ; i < ; i++) { Rando ...
随机推荐
- php ZipArchive 压缩整个文件夹
// Get real path for our folder $rootPath = realpath('folder-to-zip'); // Initialize archive object ...
- hdu6354 /// 圆的相交
题目大意: 给定m r 初始圆盘以原点为圆心半径为r 给定m个圆的圆心(x,y) 半径r 保证m个圆互不相交且不会覆盖圆盘 用这m个圆来切割初始的圆盘求最后圆盘外围的长度 求圆与圆盘的交点 减去圆盘上 ...
- 获取文件或目录的属性 stat 函数
头文件: <sys/types.h> <sys/stat.h> <unistd.h> int stat(const char *path, struct ...
- mysql的下载
怎样从Mysql官网下载mysql.tar.gz版本的安装包 原创 2016年10月20日 21:06:41 10854 今天学习在Linux上部署项目,用到了Mysql,因此想要下载适用 ...
- 支付宝支付接口-app支付沙箱环境
说明 开发阶段 需要验证自己的app支付加签是否正确,这里使用沙箱环境来进行模拟,使用ali的沙箱测试app和沙箱钱包app进行校验 准备阶段 1.进入沙箱页面 2.找到app支付文档 https:/ ...
- 【ZJOI2007】捉迷藏
题面 Description Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子. 某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏. 他们的家很大且构造很奇特,由N个屋子和N-1条 ...
- sublime Text3安装及配置与解决安装插件失败
1.下载sublime Text3的官网:https://www.sublimetext.com/32.安装Package Control 下载Package Contoral地址: 链接:htt ...
- JavaScript ---- 闭包(什么是闭包,为什么使用闭包,闭包的作用)
经常被问到什么是闭包? 说实话闭包这个概念很难解释.JavaScript权威指南里有这么一段话:“JavaScript函数是将要执行的代码以及执行这些代码作用域构成的一个综合体.在计算机学术语里,这种 ...
- leetcood学习笔记-67-二进制求和
题目描述: 第一次提交: class Solution: def addBinary(self, a: str, b: str) -> str: list_a,list_b=[],[] for ...
- hdu多校第九场 1005 (hdu6684) Rikka with Game 博弈
题意: 给一个小写字母组成的字符串,每回合轮到某人时,此人可以选择让某位+1(如果是z则变回a),或者直接结束游戏. 先手希望游戏结束时字符串字典序尽量小,后手希望游戏结束时字符串字典序尽量大,求游戏 ...