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
| #include<bits/stdc++.h> #define FOR(i,l,r) for(int i=l,END=r;i<=END;i++) #define DOR(i,r,l) for(int i=r,END=l;i>=END;i--) #define loop(i,n) for(int i=0,END=n;i<END;i++) #define mms(a,x) memset(a,x,sizeof a) #define sf scanf #define pf printf #define lowbit(x) ((x)&(-x)) using namespace std; const int P=1e9+7,N=(1<<8),M=N>>1; int n; bool flag[N]; struct Matrix{ int num[N][N]; void clear(){mms(num,0);} void init(){clear();loop(i,M)num[i][i]=1;} void Print(){loop(i,M)loop(j,M)pf("%d%c",num[i][j],j==M-1?'\n':' ');} Matrix operator*(const Matrix &A)const{ Matrix ans; ans.clear(); loop(i,M)loop(j,M) loop(k,M)ans.num[i][j]=(ans.num[i][j]+1ll*num[i][k]*A.num[k][j])%P; return ans; } }Pow[35]; bool is1(int x,int pos){return (x>>pos)&1;} bool check(int x,int y){ int mark=2; loop(i,8){ if(is1(x,i)&&is1(y,i)){ if(i<7&&is1(x,i+1)&&is1(y,i+1))i++; else {mark--;break;}; } else if(!is1(x,i)&&!is1(y,i)){mark--;break;}; } x|=(x&1)<<8; y|=(y&1)<<8; DOR(i,8,1){ if(is1(x,i)&&is1(y,i)){ if(i>1&&is1(x,i-1)&&is1(y,i-1))i--; else {mark--;break;}; } else if(!is1(x,i)&&!is1(y,i)){mark--;break;}; } return mark>0; } void init(){ loop(i,N){ int t=i,cnt=0; for(;t;t^=lowbit(t))cnt^=1; if(!cnt)flag[i]=1; } int bx=0,by=0; loop(i,N){ if(flag[i]){ by=0; loop(j,N)if(flag[j]) Pow[0].num[bx][by++]=check(i,j); bx++; } } Pow[0].num[M-1][M-1]++; FOR(i,1,32)Pow[i]=Pow[i-1]*Pow[i-1]; } int qpow(int n){ Matrix res; res.init(); loop(i,32)if(is1(n,i))res=res*Pow[i]; return res.num[M-1][M-1]; } int main(){ init(); int T,kase=0; sf("%d",&T); while(T--){ sf("%d",&n); pf("Case %d: %d\n",++kase,qpow(n)); } return 0; }
|