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

题意

求选恰好n个数,满足每个数都是不大于m的质数,且它们的异或和为0的方案数。

解法

设f(i,j)为选了i个数,异或和为j的方案数,转移如下:

\[ f(i,j)=\sum_{k\bigoplus{p}=j}{f(i-1,k)*[p\quad is\quad prime]}
\]

我们发现这是一个异或卷积的形式,状态向量一开始只有0的地方是1,它与一个只有质数下标处值为1的向量卷积n次,然后下标为0处的值就是答案。

但我们又发现n是1e9级别的,所以考虑用快速幂求出质数向量自卷n次的结果,最后再卷上状态向量就行。

总时间复杂度O(mlog2(n)log2(m)).

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define re register
  4. #define il inline
  5. #define rep(i,a,b) for(re int i=(a);i<=(b);++i)
  6. const int N =105005;
  7. int p[N],cnt,n,m;
  8. bool vis[N];
  9. il int read(){
  10. int x=0,f=1;char ch=getchar();
  11. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  12. while(ch<='9'&&ch>='0')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
  13. return x*f;
  14. }
  15. const int mod =1e9+7;
  16. typedef long long ll;
  17. const ll inv =500000004;
  18. int g[N],f[N];
  19. ll ksm1(ll x,ll y){
  20. ll aa=1ll;
  21. for(;y;y>>=1,x=(x*x)%mod)if(y&1)aa=(aa*x)%mod;
  22. return aa;
  23. }
  24. void fwt(int *a,int l,int f){
  25. re int i,j,k,x,y;
  26. for(j=1;j<l;j<<=1){
  27. for(i=0;i<l;i+=(j<<1)){
  28. for(k=i;k<i+j;++k){
  29. x=a[k],y=a[k+j];
  30. a[k]=(x+y)%mod,a[k+j]=(x-y+mod)%mod;
  31. if(f==-1)a[k]=1ll*a[k]*inv%mod,a[k+j]=1ll*a[k+j]*inv%mod;
  32. }
  33. }
  34. }
  35. }
  36. void ksm(int l,int y){
  37. fwt(g,l,1),fwt(f,l,1);
  38. for(;y;y>>=1){
  39. if(y&1){
  40. rep(i,0,l-1)f[i]=1ll*f[i]*g[i]%mod;
  41. }
  42. rep(i,0,l-1)g[i]=1ll*g[i]*g[i]%mod;
  43. }
  44. }
  45. int main(){
  46. rep(i,2,50003){
  47. if(!vis[i])p[++cnt]=i;
  48. rep(j,1,cnt){
  49. if(i*p[j]>50000)break;
  50. vis[i*p[j]]=1;
  51. if(i%p[j]==0)break;
  52. }
  53. }
  54. while(~scanf("%d%d",&n,&m)){
  55. memset(g,0,sizeof(g)),memset(f,0,sizeof(f));
  56. rep(i,1,cnt){
  57. if(p[i]>m)break;
  58. g[p[i]]=f[p[i]]=1;
  59. }
  60. int l=1;
  61. for(;l<=m;l<<=1);
  62. ksm(l,n-1);//从1次幂开始乘方,f[0]初值为0是为了强制取恰好n堆
  63. fwt(f,l,-1);
  64. printf("%d\n",f[0]);
  65. }
  66. return 0;
  67. }

[bzoj4589]Hard Nim(FWT快速沃尔什变化+快速幂)的更多相关文章

  1. BZOJ4589 Hard Nim FWT 快速幂 博弈

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4589.html 题目传送门 - BZOJ4589 题意 有 $n$ 堆石子,每一堆石子的取值为 $2$ ...

  2. BZOJ4589: Hard Nim(FWT 快速幂)

    题意 题目链接 Sol 神仙题Orzzzz 题目可以转化为从\(\leqslant M\)的质数中选出\(N\)个\(xor\)和为\(0\)的方案数 这样就好做多了 设\(f(x) = [x \te ...

  3. bzoj4589: Hard Nim fwt

    题意:求n个m以内的素数亦或起来为0的方案数 题解:fwt板子题,先预处理素数,把m以内素数加一遍(下标),然后fwt之后快速幂即可,在ifwt之后a[0]就是答案了 /*************** ...

  4. 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案

    如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案

  5. webpack快速入门——webpack3.X 快速上手一个Demo

    1.进入根目录,建两个文件夹,分别为src和dist 1).src文件夹:用来存放我们编写的javascript代码,可以简单的理解为用JavaScript编写的模块. 2).dist文件夹:用来存放 ...

  6. BZOJ4589 Hard Nim(快速沃尔什变换FWT)

    这是我第一道独立做出来的FWT的题目,所以写篇随笔纪念一下. (这还要纪念,我太弱了) 题目链接: BZOJ 题目大意:两人玩nim游戏(多堆石子,每次可以从其中一堆取任意多个,不能操作就输).$T$ ...

  7. 【bzoj4589】Hard Nim FWT+快速幂

    题目大意:给你$n$个不大于$m$的质数,求有多少种方案,使得这$n$个数的异或和为$0$.其中,$n≤10^9,m≤10^5$. 考虑正常地dp,我们用$f[i][j]$表示前$i$个数的异或和为$ ...

  8. BZOJ4589 Hard Nim(博弈+FWT)

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

  9. bzoj千题计划308:bzoj4589: Hard Nim(倍增FWT+生成函数)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4589 n*m*m 做法 dp[i][j] 前i堆石子,异或和为j的方案数 第一重循环可以矩阵快速幂 ...

随机推荐

  1. drf基础

    1.什么是编程? 数据结构和算法的结合 2.什么是REST? 同一个功能会产生五花八门的url(把查看单条记录和查看多条记录都看成是一个功能),而且响应回去的数据也没有同一的格式规范,这就造成了前后端 ...

  2. Html5 学习笔记 【PC固定布局】 实战4 footer 区域

    最终效果图: Html代码: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta chars ...

  3. b/s 起点

    1.Web前端: JavaScript (1)脚本语言.JavaScript是一种解释型的脚本语言,C.C++等语言先编译后执行,而JavaScript是在程序的运行过程中逐行进行解释. (2)基于对 ...

  4. 【设计模式】FactoryPattern工厂模式

    Factory Pattern 简单工厂模式 将变化的部分封装起来 //简单工厂 class SimpleProductFactory{ Product createProduct(String ty ...

  5. 第十三周学习总结&实验报告(八)

    图像界面 件处理及监听处理 1.键盘事件(KeyEvent)及监听处理(KeyListener) 1.1加入事件监听 super.addWindowListener(new WindowAdapter ...

  6. go中加号的用法

    // + 的用法 package main import "fmt" func main() { // 加号两端都是数字的话,做加法运算 var i = 1 var j = 1 v ...

  7. Centos7下编译安装php扩展redis5.0.2

    安装环境:centos7 + php 7.2.191. 下载地址:http://pecl.php.net/get/redis-5.0.2.tgz .tgz http://pecl.php.net/ge ...

  8. Web前端基础学习-2

    盒子模型 在页面中,我们将所有的元素全部看做是一个盒子,页面布局就是将大大小小不同的盒子堆砌在一起,而一个盒子由以下几部分组成: padding:内边距,内容到边框的距离: margin:外边距,其他 ...

  9. 最大流的SAP算法模板

    明天补充~~~先上代码 #include<iostream> #include<string> #include<queue> #include<vector ...

  10. java中的成员变量、类变量,成员方法、类方法 属性和方法区别

    成员变量:包括实例变量和类变量,用static修饰的是类变量,不用static修饰的是实例变量,所有类的成员变量可以通过this来引用. 类变量:静态域,静态字段,或叫静态变量,它属于该类所有实例共有 ...