博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ4589 Hard Nim(博弈+FWT)
阅读量:4941 次
发布时间:2019-06-11

本文共 1248 字,大约阅读时间需要 4 分钟。

  即使n个数的异或为0。如果只有两堆,将质数筛出来设为1,做一个异或卷积即可。显然这个东西满足结合律,多堆时直接快速幂。可以在点值表示下进行。

#include
#include
#include
#include
#include
#include
using namespace std;#define N (1<<17)#define P 1000000007#define inv2 500000004int read(){ int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') { if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f;}int T,n,m,f[N];bool flag[N];int ksm(int a,int k){ int s=1; for (;k;k>>=1,a=1ll*a*a%P) if (k&1) s=1ll*s*a%P; return s;}void FWT(int *a,int n,int op){ for (int i=2;i<=n;i<<=1) for (int j=0;j
>1);k++) { int x=a[k],y=a[k+(i>>1)]; a[k]=(x+y)%P,a[k+(i>>1)]=(x-y+P)%P; if (op==1) a[k]=1ll*a[k]*inv2%P,a[k+(i>>1)]=1ll*a[k+(i>>1)]*inv2%P; }}int main(){#ifndef ONLINE_JUDGE freopen("bzoj4589.in","r",stdin); freopen("bzoj4589.out","w",stdout); const char LL[]="%I64d\n";#else const char LL[]="%lld\n";#endif flag[1]=flag[0]=1; for (int i=2;i<=50000;i++) for (int j=2;j<=50000/i;j++) flag[i*j]=1; while (scanf("%d %d",&n,&m)!=EOF) { int t=1;while (t<=m) t<<=1; for (int i=0;i<=m;i++) f[i]=flag[i]^1; for (int i=m+1;i

 

转载于:https://www.cnblogs.com/Gloid/p/10205111.html

你可能感兴趣的文章
Fortran中的指针使用
查看>>
移动终端app测试点总结
查看>>
14-6-27&28自学内容小结
查看>>
JSP
查看>>
---
查看>>
(第一组_GNS3)自反ACl
查看>>
hdu--1258--Sum It Up(Map水过)
查看>>
Spring @DeclareParents 的扩展应用实例
查看>>
VS2012更新Update1后帮助查看器无法打开
查看>>
Android 文件的读取和写入
查看>>
高校表白APP-冲刺第四天
查看>>
outlook 设置163邮箱
查看>>
mysql优化——show processlist命令详解
查看>>
Solr服务器搭建
查看>>
画世界怎么用光影_世界绘画经典教程:水彩光影魔法教程
查看>>
win+rsync+php,跨平台的fswatch+rsync同步备份
查看>>
vue2 cdn 加载html,vue项目中使用CDN加载
查看>>
数组转集合踩坑
查看>>
node.js的异步I/O、事件驱动、单线程
查看>>
vue cli3 子目录问题
查看>>