BZOJ4589 Hard Nim(快速沃尔什变换模板)

Posted Monster_Yi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ4589 Hard Nim(快速沃尔什变换模板)相关的知识,希望对你有一定的参考价值。

终于抽出时间来学了学,比FFT不知道好写到哪里去。

#include <cstdio>

typedef long long ll;
const int N=65536,p=1e9+7;
int k,m,n,a[N],pi[N];
bool pr(int x) {for(int i=2;i*i<=x;i++) if(x%i==0) return 0; return 1;}
ll pw(ll a,int b) {ll r=1; for(;b;b>>=1,a=a*a%p) if(b&1) r=r*a%p; return r;}

void fwt(int *a,ll f) {
    for(int i=1,x,y;i<n;i<<=1) for(int j=0;j<n;j+=i<<1) for(int k=0;k<i;k++) x=a[j+k],y=a[j+k+i],a[j+k]=(x+y)*f%p,a[j+k+i]=(x-y+p)*f%p;
}

int main() {
    for(int i=2;i<50001;i++) if(pr(i)) pi[i]=1;
    while(~scanf("%d%d",&k,&m)) {
        for(n=1;n<=m;n<<=1);
        for(int i=0;i<=m;i++) a[i]=pi[i];
        for(int i=m+1;i<n;i++) a[i]=0;
        fwt(a,1);
        for(int i=0;i<n;i++) a[i]=pw(a[i],k);
        fwt(a,500000004),printf("%d\n",a[0]);
    }
    return 0;
}

以上是关于BZOJ4589 Hard Nim(快速沃尔什变换模板)的主要内容,如果未能解决你的问题,请参考以下文章

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

bzoj 4589 Hard Nim——FWT

bzoj4589Hard Nim FWT+快速幂

bzoj4589: Hard Nim fwt

bzoj4589 Hard Nim

bzoj4589 Hard Nim(fwt_xor+快速幂,fwt入门题)