Nim

来源:互联网 发布:在mac上使用iphone 编辑:程序博客网 时间:2024/05/14 12:03

FWT模板
还没搞懂And..
那就先把Or和Xor写一下好了

#include<cstdio>#include<iostream>#include<cstring>#include<cstdlib>using namespace std;const int  P=1000000007;const int N=66000;int n,m,k,i,j,a[N];bool v[N];inline void UFWT(){    for(int d=1;d<k;d<<=1)        for(int m=d<<1,i=0;i<k;i+=m)            for(int j=0;j<d;j++)                {                    int x=a[i+j],y=a[i+j+d];                    a[i+j]=500000004ll*(x+y)%P,a[i+j+d]=500000004ll*(x-y+P)%P;//Xor                //  a[i+j]=a[i+j],a[i+j+d]=(a[i+j]+a[i+j+d])%P;     Or                }}inline void FWT(){    for(int d=1;d<k;d<<=1)        for(int m=d<<1,i=0;i<k;i+=m)            for(int j=0;j<d;j++)                {                    int x=a[i+j],y=a[i+j+d];                    a[i+j]=(x+y)%P,a[i+j+d]=(x-y+P)%P;//Xor                //  a[i+j]=a[i+j],a[i+j+d]=(P+a[i+j]-a[i+j+d])%P;       Or                }}inline int pow(int a,int b){int t=1;for(int tt=b;tt;tt>>=1,a=a*1ll*a%P)if(tt&1)t=t*1ll*a%P;return t;}int main(){    for(i=2;i<N;i++)if(!v[i])for(j=i+i;j<N;j+=i)v[j]=1;    while(scanf("%d%d",&n,&m)==2)    {        for(k=1;k<=m;k<<=1);        for(i=0;i<k;i++)a[i]=0;        for(i=2;i<k&&i<=m;i++)if(!v[i])a[i]=1;        FWT();        for(i=0;i<k;i++)a[i]=pow(a[i],n);        UFWT();        printf("%d\n",a[0]);    }    return 0;}
0 0
原创粉丝点击