【bzoj4589】Hard Nim FWT+快速幂

题目大意:给你n个不大于m的质数,求有多少种方案,使得这n个数的异或和为0其中,n109,m105

 

考虑正常地dp,我们用f[i][j]表示前i个数的异或和为j的方案数。

我们构造一个数组g,若i为不大于m的质数,则g[i]=1,否则为0

那么显然,f[i][j]=f[i1][k]×g[jk]。  其中jk表示jk的按位异或。

然后我们不难发现,f[i]f[i1]g的异或卷积。

f[n]gn次异或卷积,答案显然为f[n][0]

我们用FWTg变成点值表达式,然后做快速幂,最后再插值回来,就得到答案了。

时间复杂度为O(m log m+m log n)

 

 

复制代码
 1 #include<bits/stdc++.h>
 2 #define M 131072
 3 #define L long long
 4 #define MOD 1000000007
 5 using namespace std;
 6 int b[M]={0},pri[M]={0},use=0;
 7 void init(){
 8     for(int i=2;i<M;i++){
 9         if(!b[i]) pri[++use]=i;
10         for(int j=1;j<=use&&i*pri[j]<M;j++){
11             b[i*pri[j]]=1;
12             if(i%pri[j]==0) break;
13         }
14     }
15 }
16 L pow_mod(L x,int k){
17     L ans=1;
18     while(k){
19         if(k&1) ans=ans*x%MOD;
20         x=x*x%MOD; k>>=1;
21     }
22     return ans;
23 }
24 void FWT(L a[],int n,int on){
25     for(int i=1;i<n;i<<=1)
26     for(int j=0;j<n;j++)
27     if(i&j){
28         L w=a[i^j];
29         a[i^j]=(w+a[j])%MOD;
30         a[j]=(w-a[j]+MOD)%MOD;
31     }
32     if(on==-1){
33         L inv=pow_mod(n,MOD-2);
34         for(int i=0;i<n;i++) a[i]=a[i]*inv%MOD;
35     }
36 }
37 L g[M]={0},ans[M]={0};
38 int main(){
39     init();
40     int t,n;
41     while(cin>>t>>n){
42         int len=1; while(len<=n) len<<=1;
43         for(int i=2;i<=n;i++) if(b[i]==0) g[i]=1;
44         FWT(g,len,1); memcpy(ans,g,M<<3); t--;
45         while(t){
46             if(t&1) for(int i=0;i<len;i++) ans[i]=ans[i]*g[i]%MOD;
47             t>>=1; for(int i=0;i<len;i++) g[i]=g[i]*g[i]%MOD;
48         }
49         FWT(ans,len,-1);
50         printf("%lld\n",ans[0]);
51         memset(g,0,len<<3); memset(ans,0,len<<3);
52     }
53 }
复制代码

 

 

 

 

posted @   AlphaInf  阅读(238)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示