题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4589

一开始异或和为0的话先手必败。有 n 堆,每堆可以填那些数,求最后异或和为0的方案数,就是一个快速幂的异或FWT。

注意快速幂的过程中对那些数组直接乘就行,不用总是FWT!!!

为什么比Zinn慢了1008ms?

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=5e4+,mod=1e9+;
int n,m,pri[],cnt,len,inv;
int f[N<<],a[N<<],b[N<<];
bool vis[N];
int pw(int x,int k)
{int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;}
void fwt(int *a,bool fx)
{
for(int R=;R<=len;R<<=)
for(int i=,m=R>>;i<len;i+=R)
for(int j=;j<m;j++)
{
int x=a[i+j]+a[i+m+j],y=a[i+j]+mod-a[i+m+j];
a[i+j]=(ll)x*(fx?inv:)%mod;
a[i+m+j]=(ll)y*(fx?inv:)%mod;
}
}
void init()
{
for(int i=;i<=;i++)
{
if(!vis[i])pri[++cnt]=i;
for(int j=;j<=cnt&&i*pri[j]<=;j++)
{
vis[i*pri[j]]=;
if(i%pri[j]==)break;
}
}
for(int i=;i<=cnt;i++)f[pri[i]]=;
inv=pw(,mod-);
}
int main()
{
init();
while(scanf("%d%d",&n,&m)==)
{
for(len=;len<=m;len<<=);
a[]=;for(int i=;i<len;i++)a[i]=;
for(int i=;i<=m;i++)b[i]=f[i];
for(int i=m+;i<len;i++)b[i]=;
fwt(a,); fwt(b,);
while(n)
{
if(n&)
for(int i=;i<len;i++)a[i]=(ll)a[i]*b[i]%mod;
for(int i=;i<len;i++)b[i]=(ll)b[i]*b[i]%mod;
n>>=;
}
fwt(a,);
printf("%d\n",a[]);
}
return ;
}

bzoj 4589 Hard Nim——FWT的更多相关文章

  1. bzoj 4589 Hard Nim —— FWT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4589 先手必败,是一开始所有石子的异或和为0: 生成函数 (xpri[1] + xpri[2 ...

  2. BZOJ.4589.Hard Nim(FWT)

    题目链接 FWT 题意即,从所有小于\(m\)的质数中,选出\(n\)个数,使它们异或和为\(0\)的方案数. 令\(G(x)=[x是质数]\),其实就是对\(G(x)\)做\(n\)次异或卷积后得到 ...

  3. BZOJ 4589 Hard Nim ——FWT

    [题目分析] 位运算下的卷积问题. FWT直接做. 但还是不太民白,发明者要承担泽任的. [代码] #include <cstdio> #include <cstring> # ...

  4. FWT [BZOJ 4589:Hard Nim]

    4589: Hard Nim Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 275  Solved: 152[Submit][Status][Disc ...

  5. BZOJ 4589 Hard Nim(FWT+博弈论+快速幂)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4589 [题目大意] 有n堆石子,每堆都是m以内的质数,请问后手必胜的局面有几种 [题解 ...

  6. BZOJ 4589 Hard Nim(FWT加速DP)

    题目链接  Hard Nim 设$f[i][j]$表示前$i$个数结束后异或和为$j$的方案数 那么$f[i][j] = f[i-1][j$ $\hat{}$ $k]$,满足$k$为不大于$m$的质数 ...

  7. bzoj 4589: Hard Nim【线性筛+FWT+快速幂】

    T了两次之后我突然意识到转成fwt形式之后,直接快速幂每次乘一下最后再逆回来即可,并不需要没此次都正反转化一次-- 就是根据nim的性质,先手必输是所有堆个数异或和为0,也就变成了一个裸的板子 #in ...

  8. [BZOJ 4589]Hard Nim

    Description 题库链接 两人玩 \(nim\) 游戏,\(n\) 堆石子,每堆石子初始数量是不超过 \(m\) 的质数,那么后手必胜的方案有多少种.对 \(10^9+7\) 取模. \(1\ ...

  9. bzoj 4589 FWT

    #include<bits/stdc++.h> #define ll long long using namespace std; ; ; ; ; <<],b[<< ...

随机推荐

  1. 【Flask】Sqlalchemy limit, offset slice操作

    ### limit.offset和切片操作:1. limit:可以限制每次查询的时候只查询几条数据.2. offset:可以限制查找数据的时候过滤掉前面多少条.3. 切片:可以对Query对象使用切片 ...

  2. P4309 [TJOI2013]最长上升子序列

    题目 P4309 [TJOI2013]最长上升子序列 做法 最长上升序列的求法肯定是烂大街了 水题是肯定的,确定出序列的位置然后套个树状数组就好了(强制在线的话改成线段树维护前缀最值也行) 所以说这题 ...

  3. jQuery滑动杆打分插件

    在线演示 本地下载

  4. CentOS 7卸载mariadb安装mysql

    CentOS 7已经将默认集成mariadb而不是mysql,这对于多数还是依赖于mysql的应用来说,需要手动的进行更新. 可能会遇到这样错误,换成MySQL就好了. error 2002 (hy0 ...

  5. 一览Swift中的常用关键字

    要学习Swift这门语言,就必须先了解Swift的关键字及对应的解释.这里就列一下在Swift中常用到的关键字. 关键字是类似于标识符的保留字符序列,除非用重音符号(`)将其括起来,否则不能用作标识符 ...

  6. java 命令行

    javac 编译 linux平台下:javac -cp ./hadoop-common-2.7.1.jar:./hadoop-mapreduce-client-core-2.7.4.jar: Word ...

  7. 字符串匹配算法BF和KMP总结

    背景 来看一道leetcode题目: Implement strStr(). Returns the index of the first occurrence of needle in haysta ...

  8. 解决fasterxml中string字符串转对象json格式错误问题

    软件152 尹以操 springboot中jackson使用的包是fasterxml的.可以通过如下代码,将一个形如json格式string转为一个java对象: com.fasterxml.jack ...

  9. C中的指针和字符串

    程序 #include<stdio.h>int main(void){ char *mesg="Don't be a fool!"; char *copy; copy= ...

  10. Swagger自动生成接口文档

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...