Nim
发布日期:2021-05-06 03:50:33 浏览次数:20 分类:原创文章

本文共 1289 字,大约阅读时间需要 4 分钟。

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;}
上一篇:BZOJ3492: PA2012 Binary Dodgeball
下一篇:BZOJ3771: Triple

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月03日 20时23分12秒