题面: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)).

#include<bits/stdc++.h>
using namespace std;
#define re register
#define il inline
#define rep(i,a,b) for(re int i=(a);i<=(b);++i)
const int N =105005;
int p[N],cnt,n,m;
bool vis[N];
il int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x*f;
}
const int mod =1e9+7;
typedef long long ll;
const ll inv =500000004;
int g[N],f[N];
ll ksm1(ll x,ll y){
ll aa=1ll;
for(;y;y>>=1,x=(x*x)%mod)if(y&1)aa=(aa*x)%mod;
return aa;
}
void fwt(int *a,int l,int f){
re int i,j,k,x,y;
for(j=1;j<l;j<<=1){
for(i=0;i<l;i+=(j<<1)){
for(k=i;k<i+j;++k){
x=a[k],y=a[k+j];
a[k]=(x+y)%mod,a[k+j]=(x-y+mod)%mod;
if(f==-1)a[k]=1ll*a[k]*inv%mod,a[k+j]=1ll*a[k+j]*inv%mod;
}
}
}
}
void ksm(int l,int y){
fwt(g,l,1),fwt(f,l,1);
for(;y;y>>=1){
if(y&1){
rep(i,0,l-1)f[i]=1ll*f[i]*g[i]%mod;
}
rep(i,0,l-1)g[i]=1ll*g[i]*g[i]%mod;
}
}
int main(){
rep(i,2,50003){
if(!vis[i])p[++cnt]=i;
rep(j,1,cnt){
if(i*p[j]>50000)break;
vis[i*p[j]]=1;
if(i%p[j]==0)break;
}
}
while(~scanf("%d%d",&n,&m)){
memset(g,0,sizeof(g)),memset(f,0,sizeof(f));
rep(i,1,cnt){
if(p[i]>m)break;
g[p[i]]=f[p[i]]=1;
}
int l=1;
for(;l<=m;l<<=1);
ksm(l,n-1);//从1次幂开始乘方,f[0]初值为0是为了强制取恰好n堆
fwt(f,l,-1);
printf("%d\n",f[0]);
}
return 0;
}

[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. springboot 尚桂谷学习总结02

    ------向导快速创建Springboot 项目------ 1.使用spring initializer 快速创建一个springboot 项目 选择后 最后点击finsh 向导会联网创建 spr ...

  2. 中介者模式(Mediator Pattern)

    用于减少多个对象或类之间的通信复杂性. 此模式提供了一个中介类,它通常处理不同类之间的所有通信,并支持通过松散耦合来维护代码.中介者模式属于行为模式类别. 实现实例 在这里通过一个聊天室的示例来演示中 ...

  3. MySQL-mysql_config_editor安全登录工具

    mysql_config_editor出现在mysql5.6.6以后的版本,可以给指定的连接和密码生成一个加密文件.mylogin.cnf,默认位于当前用户家目录下.通过该文件可以使用mysql.my ...

  4. Spring学习笔记(6)——IoC的三种注入方式

    1.接口注入(不推荐) 2.构造器注入(死的应用) 3.getter,setter方式注入(比较常用) Type1 接口注入 我们常常借助接口来将调用者与实现者分离.如: public class C ...

  5. 下载Spring各个版本的jar包

    网址:https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/org/springframew ...

  6. LVS _keepalived 配置

    #!/bin/bash HOSTNAME=$(HOSTNAME) ETHNAME=ens34 ID=-]{,}\.[-]{,}\.[-]{,}\.[-]{,}" | awk -F . 'NR ...

  7. Logback配置,error和普通日志分离

    <?xml version="1.0" encoding="utf-8"?> <configuration> <springPro ...

  8. LeetCode Linked List Easy 83. Remove Duplicates from Sorted List

    Description Given a sorted linked list, delete all duplicates such that each element appear only onc ...

  9. eclipse调试代码无法查看jdk变量解决方法

    1.无法查看jdk变量原因 oracle在公司在编译jdk的时候,把debug给关闭了,现在需要我们自己重新打包编译一次 2.eclipse创建一个普通java项目,取名叫jdk 3.导入jdk源码, ...

  10. 你了解SEO中的时效性吗?

    你了解SEO中的时效性吗? 本文摘自web前端早读课,侵删. 前言 最近刚好在负责一个新项目,App在还没上线的前提上,PC/WAP可以优先部署相关SEO,这样在后续的推广中得以运用.今日早读文章由腾 ...