【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. 每次只能从一堆中取若干个,可将一堆全取走, ...
随机推荐
- 11 go并发编程-上
其他编程语言并发编程的效果 并发编程可以让开发者实现并行的算法以及编写充分利用多核处理器和多核性能的程序.在当前大部分主流的编程语言里,如C,C++,java等,编写维护和调试并发程序相比单线程程序而 ...
- InstallShield 制作MSI
1. click [project Assistant] 2. select [Build Installation], open this tab asfollow: 3.whenbuild ok ...
- 教你ABBYY FineReader 12添加图像的技巧
ABBYY FineReader 12是一款OCR图片文字识别软件,而且强大的它现在还可使用快速扫描窗口中的快速打开.扫描并保存为图像或任务自动化任务,在没有进行预处理和OCR的ABBYY FineR ...
- 用plsql 导入导出oracle表结构数据
一.导出 (1)导出数据 进入pl/sql,"工具"---->"Export Tables...",然后在弹出的对话框中选择要导出的表,最后点击" ...
- Struts2_day04讲义_使用Struts2完成用户登录的权限拦截器的代码编写
- DOS 配置IP地址
@echo off :startIP set /p source=STATIC Y or N or E: echo source:%source% if "%source%" == ...
- 在netbeans下使用调试PHP的插件XdeBug
本人的开发环境: wamp最新官网wampserver2.2d-x32版. 下载点:http://nchc.dl.sourceforge.net/project/wampserver/WampServ ...
- flexbox子盒子flex属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- RabbitMQ :VHost,Exchanges, Queues,Bindings and Channels
和RabbitMQ这个项目的缘分好奇怪,很长一段时间内是只关注源代码,真的是Erlang开源项目中的典范;现在要在项目中应用RabbitMQ,从新的视角切入,全新的感觉.仿佛旧情人换了新衣,虽是熟稔却 ...
- Libjingle库 综述
国内现在很多语音聊天工具都是基于TURN方式实现的,包括YY.AK等等,这种方式对于服务器的性能要求很高,而且在用户量增大的时候,服务器压力也会越来越大,用户的语音质量也会受到很大影响.而基于P2P方 ...