BZOJ.4589.Hard Nim(FWT)
题意即,从所有小于\(m\)的质数中,选出\(n\)个数,使它们异或和为\(0\)的方案数。
令\(G(x)=[x是质数]\),其实就是对\(G(x)\)做\(n\)次异或卷积后得到多项式的第\(0\)项。
如果\(n\)很小,可以一次次的FWT。事实上在第一次FWT之后,直接快速幂就行了,不需要中间IFWT转回去。
//1652kb 4352ms
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
#define inv2 500000004
#define mod 1000000007
#define Add(x,y) (x+y>=mod?x+y-mod:x+y)
#define Sub(x,y) (x<y?x-y+mod:x-y)
typedef long long LL;
const int N=65540;
int not_P[N],P[N>>2];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
void Init(int n)
{
not_P[1]=1;
for(int i=2,cnt=0; i<=n; ++i)
{
if(!not_P[i]) P[++cnt]=i;
for(int j=1; j<=cnt&&i*P[j]<=n; ++j)
{
not_P[i*P[j]]=1;
if(!(i%P[j])) break;
}
}
}
void FWT(int *a,int lim,int opt)
{
for(int i=2; i<=lim; i<<=1)
for(int j=0,mid=i>>1; j<lim; j+=i)
for(int k=j,x,y; k<j+mid; ++k)
{
x=a[k],y=a[k+mid];
a[k]=Add(x,y), a[k+mid]=Sub(x,y);
if(opt==-1) a[k]=1ll*a[k]*inv2%mod, a[k+mid]=1ll*a[k+mid]*inv2%mod;
}
}
void FP(int *x,int *t,int n,int k)
{
for(; k; k>>=1)
{
if(k&1) for(int i=0; i<n; ++i) t[i]=1ll*t[i]*x[i]%mod;
for(int i=0; i<n; ++i) x[i]=1ll*x[i]*x[i]%mod;
}
}
int main()
{
static int A[N],res[N];
Init(50000);
int n,m;
while(~scanf("%d%d",&n,&m))
{
memset(A,0,sizeof A);
for(int i=1; i<=m; ++i) A[i]=!not_P[i];
int lim=1; while(lim<=m) lim<<=1;
FWT(A,lim,1);
for(int i=0; i<lim; ++i) res[i]=A[i];
FP(A,res,lim,n-1), FWT(res,lim,-1);
printf("%d\n",res[0]);
}
return 0;
}
BZOJ.4589.Hard Nim(FWT)的更多相关文章
- bzoj 4589 Hard Nim——FWT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4589 一开始异或和为0的话先手必败.有 n 堆,每堆可以填那些数,求最后异或和为0的方案数, ...
- bzoj 4589 Hard Nim —— FWT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4589 先手必败,是一开始所有石子的异或和为0: 生成函数 (xpri[1] + xpri[2 ...
- BZOJ 4589 Hard Nim ——FWT
[题目分析] 位运算下的卷积问题. FWT直接做. 但还是不太民白,发明者要承担泽任的. [代码] #include <cstdio> #include <cstring> # ...
- FWT [BZOJ 4589:Hard Nim]
4589: Hard Nim Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 275 Solved: 152[Submit][Status][Disc ...
- BZOJ 4589 Hard Nim(FWT+博弈论+快速幂)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4589 [题目大意] 有n堆石子,每堆都是m以内的质数,请问后手必胜的局面有几种 [题解 ...
- BZOJ 4589 Hard Nim(FWT加速DP)
题目链接 Hard Nim 设$f[i][j]$表示前$i$个数结束后异或和为$j$的方案数 那么$f[i][j] = f[i-1][j$ $\hat{}$ $k]$,满足$k$为不大于$m$的质数 ...
- bzoj 4589: Hard Nim【线性筛+FWT+快速幂】
T了两次之后我突然意识到转成fwt形式之后,直接快速幂每次乘一下最后再逆回来即可,并不需要没此次都正反转化一次-- 就是根据nim的性质,先手必输是所有堆个数异或和为0,也就变成了一个裸的板子 #in ...
- [BZOJ 4589]Hard Nim
Description 题库链接 两人玩 \(nim\) 游戏,\(n\) 堆石子,每堆石子初始数量是不超过 \(m\) 的质数,那么后手必胜的方案有多少种.对 \(10^9+7\) 取模. \(1\ ...
- bzoj 4589 FWT
#include<bits/stdc++.h> #define ll long long using namespace std; ; ; ; ; <<],b[<< ...
随机推荐
- Windows下Anaconda的安装和简单使用
Windows下Anaconda的安装和简单使用 Anaconda is a completely free Python distribution (including for commercial ...
- linux kernel的cmdline参数解析原理分析【转】
转自:https://blog.csdn.net/skyflying2012/article/details/41142801 版权声明:本文为博主kerneler辛苦原创,未经允许不得转载. htt ...
- camera驱动框架分析(上)【转】
转自:https://www.cnblogs.com/rongpmcu/p/7662738.html 前言 camera驱动框架涉及到的知识点比较多,特别是camera本身的接口就有很多,有些是直接连 ...
- Bootstrap3.0学习第五轮(表格)
详情请查看 http://aehyok.com/Blog/Detail/11.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:h ...
- linux下使用screen和ping命令对网络质量进行监控
linux下使用screen和ping命令对网络质量进行监控 场景:应用连接云服务器经常偶尔会出现连接不上的情况,android和IOS端连接的时候也会出现tcp延时5秒以上,现在想验证是否是云服务商 ...
- centos配置golang & SVN客户端配置
环境:centos 6.5 一.下载和解压go环境包 >>cd /usr/local/ >>wget -c http://golangtc.com/static/go/go1. ...
- Math对象应用详解
JavaScript中的Math对象提供了大量的算术运算功能和数值操作方法. JavaScript中的Math对象的与众不同之处在于,它是一个全局对象.在使用Math对象之前,既不需要将一个变量声明为 ...
- Linux学习指导
初次学习Linux,首先在虚拟机中尝试它. 虚拟机我推荐Virtual Box,我并不主张使用VM,原因是VM是闭源的,并且是收费的,而Virtual Box很小巧,Windows平台下安装包在80M ...
- django----重定向
urlpatterns = [ re_path(r'^(\w+)(\w+)/$',views.index,name="index"), ] 1.<a href="{ ...
- 区间dp的一些模式和总结
参考博客:https://blog.csdn.net/my_sunshine26/article/details/77141398 https://blog.csdn.net/qq_38569113/ ...