【CF850E】Random Elections FWT
【CF850E】Random Elections
题意:有n位选民和3位预选者A,B,C,每个选民的投票方案可能是ABC,ACB,BAC...,即一个A,B,C的排列。现在进行三次比较,A-B,B-C,C-A。每次比较的结果由一个给定的函数决定$f(x):{0,1}^n\rightarrow {0,1}$,即读入一个长度为n的bool数组,返回一个bool变量。假如是A和B比较,则读入数组的第i个bool是 第i个人的排列中,A是否在B的前面;返回的bool是 A获胜还是B获胜。现在给你函数f(一张包含2^n个bool的表),所有选民的方案都是随机的,问你有多少种方案使得 存在一个预选者获得2场胜利。
如果嫌我说的太不清楚还是看原题吧~
题解:假设A赢了两场,那么我们设两次比较时的bool数组为$A-B:P_1$和$A-C:P_2$,考虑第i个人:
如果在$P_1$中这个人是0,在$P_2$中这个人是0,那么这个人可能的投票方案为CBA,BCA
同理得到:
(0,0)->CBA,BCA
(0,1)->BAC
(1,0)->CAB
(1,1)->ABC,ACB
所以说,如果$P_1\ \mathrm{xor}\ P_2$中有cnt个1,那么投票方案就是$2^{n-cnt}$。
也就是说我们把f数组和自身做一下异或卷积,然后把每一个数的值$\times 2^{n-cnt}$加到一起即可。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const ll P=1000000007;
const int maxn=(1<<20)+4;
int n,l;
ll ans;
int cnt[maxn];
ll a[maxn];
char str[maxn];
inline void fwt()
{
int h,i,j;
ll x,y;
for(h=2;h<=l;h<<=1) for(i=0;i<l;i+=h) for(j=i;j<i+h/2;j++) x=a[j],y=a[j+h/2],a[j]=x+y,a[j+h/2]=x-y;
}
inline void ufwt()
{
int h,i,j;
ll x,y;
for(h=2;h<=l;h<<=1) for(i=0;i<l;i+=h) for(j=i;j<i+h/2;j++) x=a[j],y=a[j+h/2],a[j]=(x+y)/2,a[j+h/2]=(x-y)/2;
}
int main()
{
scanf("%d",&n),l=1<<n;
int i;
scanf("%s",str);
for(i=0;i<l;i++) a[i]=str[i]-'0';
fwt();
for(i=0;i<l;i++) a[i]=a[i]*a[i];
ufwt();
ans=a[0]*l%P;
for(i=1;i<l;i++) cnt[i]=cnt[i-(i&-i)]+1,ans=(ans+a[i]*(1<<(n-cnt[i])))%P;
printf("%lld",ans*3%P);
return 0;
}
【CF850E】Random Elections FWT的更多相关文章
- 【CF850E】Random Elections(FWT)
[CF850E]Random Elections(FWT) 题面 洛谷 CF 题解 看懂题就是一眼题了... 显然三个人是等价的,所以只需要考虑一个人赢了另外两个人就好了. 那么在赢另外两个人的过程中 ...
- 【CSU1911】Card Game(FWT)
[CSU1911]Card Game(FWT) 题面 vjudge 题目大意: 给定两个含有\(n\)个数的数组 每次询问一个数\(x\),回答在每个数组中各选一个数,或起来之后的结果恰好为\(x\) ...
- 【题解】毒蛇越狱(FWT+容斥)
[题解]毒蛇越狱(FWT+容斥) 问了一下大家咋做也没听懂,按兵不动没去看题解,虽然已经晓得复杂度了....最后感觉也不难 用FWT_OR和FWT_AND做一半分别求出超集和和子集和,然后 枚举问号是 ...
- 【CF772D】Varying Kibibits FWT
[CF772D]Varying Kibibits 题意:定义函数f(a,b,c...)表示将a,b,c..的10进制下的每一位拆开,分别取最小值组成的数.如f(123,321)=121,f(530, ...
- 【XSY2753】Lcm 分治 FWT FFT 容斥
题目描述 给你\(n,k\),要你选一些互不相同的正整数,满足这些数的\(lcm\)为\(n\),且这些数的和为\(k\)的倍数. 求选择的方案数.对\(232792561\)取模. \(n\leq ...
- ZH奶酪:【Python】random模块
Python中的random模块用于随机数生成,对几个random模块中的函数进行简单介绍.如下:random.random() 用于生成一个0到1的随机浮点数.如: import random ra ...
- 【bzoj4589】Hard Nim FWT+快速幂
题目大意:给你$n$个不大于$m$的质数,求有多少种方案,使得这$n$个数的异或和为$0$.其中,$n≤10^9,m≤10^5$. 考虑正常地dp,我们用$f[i][j]$表示前$i$个数的异或和为$ ...
- 【learning】快速沃尔什变换FWT
问题描述 已知\(A(x)\)和\(B(x)\),\(C[i]=\sum\limits_{j\otimes k=i}A[j]*B[k]\),求\(C\) 其中\(\otimes\)是三种位运算的其中一 ...
- 【bzoj4589】Hard Nim FWT
题目描述 Claris和NanoApe在玩石子游戏,他们有n堆石子,规则如下: 1. Claris和NanoApe两个人轮流拿石子,Claris先拿. 2. 每次只能从一堆中取若干个,可将一堆全取走, ...
随机推荐
- webService(SOAP)性能测试脚本
本文以天气预报的webService为基础进行学习 webService地址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx ...
- 有关maven不能加载ojdbc14.jar解决方法
首先下载ojdbc14-10.2.0.4.0.jar这个包,然后在cmd下输入以下 mvn install:install-file -DgroupId=com.oracle -DartifactId ...
- The difference between the request time and the current time is too large.阿里云oss上传图片报错
The difference between the request time and the current time is too large. 阿里云oss上传图片的时候报错如上, 解决办法,把 ...
- java中*和**的作用
“*”就表示了所有的文件,但是“*”并不包括子目录下的文件: “**”匹配包含任意级子目录中所有的文件
- SQL Compare数据库比较工具 完全破解+使用教程
来源http://www.cnblogs.com/duci/articles/4482665.html 一.使用教程 SQL Compare是编程人员常用的比较两个数据库之间差异的工具.可以用来比较数 ...
- Java -- 异常的捕获及处理 -- 范例 -- throw与throws的应用
7.2.3 范例 -- throw与throws的应用 例:综合应用 Class : Math package limeThrowable._7_2_3; public class Math { pu ...
- 5 -- Hibernate的基本用法 --2 2 Hibernate的数据库操作
在所有的ORM框架中有一个非常重要的媒介 : PO(持久化对象:Persistent Object).持久化对象的作用是完成持久化操作,简单地说,通过该对象可对数据执行增.删.改的操作 ------ ...
- hbase2.0.0-安装部署
依赖hadoop 环境,我这边的版本是hadoop-2.6.5 选择hbase2.0.0版本的时候,去官网查看支持的hadoop版本 1.伪分布式安装 下载:http://mirror.bit.edu ...
- SaltStack 批量安装软件
这里我们用 SaltStack 服务端对多台客户端远程批量安装 httpd,步骤如下: [root@localhost ~]$ vim /etc/salt/master # 编辑配置文件,打开base ...
- php-fpm 记录慢执行日志
有时候我们访问一个 php 的网站很慢,要想知道慢的原因,需要配置 php-fpm.conf,记录执行慢的日志: [root@localhost ~]$ cat /usr/local/php/etc/ ...