1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <iostream> using namespace std; #define ll long long #define M 6561 #define mem(x) memset((x),0,sizeof(x)) const ll mod=1e9+9; const ll G=2; inline ll Pow(ll x,int y) { ll ans=1; for(;y;y>>=1,x=x*x%mod) if(y&1) ans=ans*x%mod; return ans; } const ll w1=Pow(G,(mod-1)/3); const ll w2=Pow(G,(mod-1)/3*2); const ll inv3=Pow(3,mod-2); const ll inv2=Pow(2,mod-2); inline void fwt(ll *a,int n,int opt) { static ll c[3],b[3]; for(int i=1,len=3;len<=n;i*=3,len*=3) for(int j=0;j<n;j+=len) for(int k=0;k<i;k++) { for(int l=0;l<3;l++) b[l]=a[j+k+l*i]; if(opt==1) { c[0]=(b[0]+b[1]+b[2])%mod; c[1]=(b[0]+b[1]*w1+b[2]*w2)%mod; c[2]=(b[0]+b[1]*w2+b[2]*w1)%mod; for(int l=0;l<3;l++) b[l]=c[l]; } else { c[0]=(b[0]+b[1]+b[2])%mod; c[1]=(b[0]+b[1]*w2+b[2]*w1)%mod; c[2]=(b[0]+b[1]*w1+b[2]*w2)%mod; for(int l=0;l<3;l++) b[l]=c[l]*inv3%mod; } for(int l=0;l<3;l++) a[j+k+l*i]=b[l]; } } ll p3[10],a[8][M],_a[8][M],b[8][M],_b[8][M],c[8][M],n; int p; int main() { p3[0]=1; for(int i=1;i<8;i++) p3[i]=p3[i-1]*3; while(~scanf("%lld%d",&n,&p)) { ll now,tmp; for(int t=59;~t;t--) if((now=(n>>t))) if(now==1) { for(int i=0;i<p;i++) mem(a[i]),mem(b[i]); for(int i=1;i<8;i++) a[i%p][p3[i]]=b[i%p][p3[i]]=1; a[0][1]=1; for(int i=0;i<p;i++) fwt(a[i],M,1),fwt(b[i],M,1),memcpy(c[i],a[i],sizeof(a[i])); tmp=8%p; } else { for(int i=0;i<p;i++) mem(_a[i]),mem(_b[i]); for(int i=0;i<p;i++) for(int j=0;j<p;j++) { int l=(i*tmp+j)%p; for(int k=0;k<M;k++) (_a[l][k]+=a[i][k]*a[j][k])%=mod, (_b[l][k]+=b[i][k]*a[j][k])%=mod; } for(int i=0;i<p;i++) memcpy(a[i],_a[i],sizeof(_a[i])),memcpy(b[i],_b[i],sizeof(_b[i])); tmp=tmp*tmp%p; if(!(now&1ll)) continue; for(int i=0;i<p;i++) mem(_a[i]),mem(_b[i]); for(int i=0;i<p;i++) for(int j=0;j<p;j++) { int l=(i*8+j)%p; for(int k=0;k<M;k++) (_a[l][k]+=a[i][k]*c[j][k])%=mod, (_b[l][k]+=b[i][k]*c[j][k])%=mod; } for(int i=0;i<p;i++) memcpy(a[i],_a[i],sizeof(a[i])),memcpy(b[i],_b[i],sizeof(b[i])); tmp=tmp*8%p; } fwt(b[0],M,-1); printf("%lld\n",b[0][0]); } return 0; }
|