题目链接:codeforces 850E

翻译:luogu

读题是第一要务(大选这么随便真的好吗)

其实答案问你的就是在所有选民心中支持的人的所有情况中,能让一个人连赢两场的情况数是多少

我们假设\(A\)赢了\(B\)和\(C\),最后将答案\(\times 3\)即可

再记\(A\)赢\(B\)时的\(01\)串为\(S_1\),\(A\)赢\(C\)时的\(01\)串为\(S_2\),那么对于这两个串的第\(i\)位与该选民的支持情况的对应有如下\(4\)种情况

1)\((0,0)\),此时有两种可能\(BCA,CBA\)

2)\((0,1)\),只有一种情况\(BAC\)

3)\((1,0)\),\(CAB\)

4)\((1,1)\),\(ABC\)或\(ACB\)

这意味着对于\(S_1\)和\(S_2\)中相同的位上对答案有\(\times 2\)的贡献,记其不同的位为\(cnt\),则此时的答案为\(2^{n-cnt}\)

为什么记不同的呢?因为不同的数量我们可以直接\(xor\)搞一下

还要考虑\(A\)连胜两场呢?这不就对应着两次函数\(f\)的值的乘积为\(1\)吗

于是把题目中的\(f\)数组做一下\(xor\)卷积,每一位对答案的贡献就是\(2^{n-cnt_i}*p_i\)(\(p_i\)表示卷积之后的数组的值)

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
using namespace std;
const int maxd=1000000007,N=100000,inv2=500000004;
const double pi=acos(-1.0);
typedef long long ll;
int n,cnt[1100000];
ll bin[1100000],a[1100000],b[1100000];
char s[1100000]; int read()
{
int x=0,f=1;char ch=getchar();
while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
return x*f;
} void fwt(int lim,ll *a,int typ)
{
int mid;
for (mid=1;mid<lim;mid<<=1)
{
int len=(mid<<1),sta,j;
for (sta=0;sta<lim;sta+=len)
{
for (j=0;j<mid;j++)
{
int x=a[sta+j],y=a[sta+j+mid];
a[sta+j]=(x+y)%maxd;
a[sta+j+mid]=(x-y+maxd)%maxd;
if (typ==-1)
{a[sta+j]=(a[sta+j]*inv2)%maxd;a[sta+j+mid]=(a[sta+j+mid]*inv2)%maxd;}
}
}
}
} int main()
{
n=read();int lim=(1<<n),i;
scanf("%s",s);bin[0]=1;
for (i=0;i<lim;i++) {a[i]=s[i]-'0';b[i]=a[i];}
for (i=1;i<lim;i++) {bin[i]=(bin[i-1]<<1)%maxd;cnt[i]=cnt[i>>1]+(i&1);}
fwt(lim,a,1);fwt(lim,b,1);
for (i=0;i<lim;i++) a[i]=(a[i]*b[i])%maxd;
fwt(lim,a,-1);
ll ans=0;
for (i=0;i<lim;i++) ans=((a[i]*bin[n-cnt[i]])%maxd+ans)%maxd;
ans=(ans*3)%maxd;
printf("%lld",ans);
return 0;
}

codeforces850E Random Elections的更多相关文章

  1. 【CF850E】Random Elections(FWT)

    [CF850E]Random Elections(FWT) 题面 洛谷 CF 题解 看懂题就是一眼题了... 显然三个人是等价的,所以只需要考虑一个人赢了另外两个人就好了. 那么在赢另外两个人的过程中 ...

  2. 【CF850E】Random Elections FWT

    [CF850E]Random Elections 题意:有n位选民和3位预选者A,B,C,每个选民的投票方案可能是ABC,ACB,BAC...,即一个A,B,C的排列.现在进行三次比较,A-B,B-C ...

  3. [Codeforces]850E - Random Elections

    FWT裸题,写了下模板 #include<cstdio> #define ll long long #define r register int #define MN (1<< ...

  4. CF850 E. Random Elections

    题目传送门:CF 题目大意: 现有\(A,B,C\)三人参加竞选,有n个市民对其进行投票,每个市民心中对三人都有一个优先顺序(如市民\(i\)对三人的优先顺序为\(A-C-B\),则凡是有\(A\)的 ...

  5. CF850E Random Elections

    题意:一共有n个人,要在三个人中选prefer,一开始他们心中都会想好他们的排名(共6种),之后给出的判断不会矛盾.规则如下:一共有三轮,分别是a->b,b->c,c->a,每个人选 ...

  6. CF850E Random Elections 题解

    题目传送门 题目大意 没法描述,过于繁杂. 思路 果然自己是个菜鸡,只能靠读题解读题,难受极了,其实不是很难自己应该做得出来的....哎.... 不难发现可以统计 \(A\) 获胜的情况乘上 \(3\ ...

  7. Chrome V8引擎系列随笔 (1):Math.Random()函数概览

    先让大家来看一幅图,这幅图是V8引擎4.7版本和4.9版本Math.Random()函数的值的分布图,我可以这么理解 .从下图中,也许你会认为这是个二维码?其实这幅图告诉我们一个道理,第二张图的点的分 ...

  8. Math.random()

    Math.random() 日期时间函数(需要用变量调用):var b = new Date(); //获取当前时间b.getTime() //获取时间戳b.getFullYear() //获取年份b ...

  9. .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数

    .Net中我们通常使用Random类生成随机数,在一些场景下,我却发现Random生成的随机数并不可靠,在下面的例子中我们通过循环随机生成10个随机数: ; i < ; i++) { Rando ...

随机推荐

  1. python 文件和目录操作题库

    1. 把一个目录下所有的文件删除,在所有的目录下新建一个a.txt的文件,并在文件下写入"python"关键字.   解题思路:        1.如果目录存在则切换进入目录    ...

  2. C#创建IIS站点及相应的应用程序池,支持IIS6.0+Windows Server 2003. 使用Builder设计模式

    测试项目结构: PS:IIS6UtilsBuilder, IIS7UtilsBuilder,IISUtilsBuilder以及IISDirector为Builder设计模式实现的核心代码.Progra ...

  3. Java虚拟机判定对象存活算法

    1.引用计数算法 描述:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器值为0的对象就是不可能再被使用的. 特点:实现简单,判定效率高. ...

  4. 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

    责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...

  5. arcgis api 3.x for js 入门开发系列十六迁徙流动图

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  6. 最新git源码下载地址

    1.最新git源码下载地址: https://github.com/git/git/releases https://www.kernel.org/pub/software/scm/git/ 可以手动 ...

  7. 【Oracle教程资源大合集】Oracle数据库免费学习资源汇总

    Oracle的产品非常丰富,各类学习资源也五花八门,本文将介绍Oracle官方的免费教程与风哥整理的Oracle视频教程: 1.Oracle帮助中心 Oracle帮助中心也称为Oracle文档中心,这 ...

  8. vue watch监听验证码时,axios延迟发送post请求。

    标题写的全面一些,方便其他人检索,我就是找了半天找不到资料,最后自己搞定了. 原理: 每次监听到输入值变化,就打一个时间戳,然后暂停2秒再去提交post验证. 但是每次提交前,判断一下之前打的时间戳和 ...

  9. python类的继承、封装和多态

    摘自https://www.cnblogs.com/evablogs/p/6724477.html 继承 1 2 3 4 5 6 7 8 class Person(object):     def _ ...

  10. Ubuntu下搭建spark2.4环境(单机版)

    说明:单机版的Spark的机器上只需要安装JDK即可,其他诸如Hadoop.Zookeeper(甚至是scala)之类的东西可以一概不安装.集群版搭建:Spark2.2集群部署和配置 一.安装JDK1 ...