RT,在本地还没输入就 RE 了,把断点加在 init() 上调试时,发现程序连一步都没有运行。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=300;
const ll mod=1e9+7;
struct mat{
ll a[N][N];
void id(){for(int i=0;i<256;i++) a[i][i]=1;}
};
mat operator *(mat a,mat b)
{
mat c;
for(int i=0;i<256;i++)
for(int j=0;j<256;j++)
for(int k=0;k<256;k++)
(c.a[i][k]+=a.a[i][j]*b.a[j][k]%mod)%=mod;
return c;
}
mat ksm(mat a,int b)
{
mat ret,tmp=a; ret.id();
while(b)
{
if(b&1) ret=ret*tmp;
tmp=tmp*tmp;
b>>=1;
}
return ret;
}
mat A,B,C,IN,OUT;
const int d[50]={0,0,129,192,96,225,48,177,240,24,153,216,120,249,12,141,204,108,237,60,189,252,6,135,198,102,231,54,183,246,30,159,222,126,255,3,195,99,51,243,27,219,123,15,207,111,63,255};
const int nz=47;
void init()
{
for(int i=0;i<256;i++) A.a[i][256-i]=1;
for(int j=0;j<=255;j++)
for(int k=1;k<=47;k++)
B.a[j^d[k]][j]++;
C=A*B;
IN.a[0][143]=1;
}
int n;
int main()
{
init();
scanf("%d",&n);
OUT=IN*ksm(C,n);
printf("%lld\n",OUT.a[0][143]);
return 0;
}