挺有意思的一道题
要会运用一些常见的位运算操作进行优化
题目的本质就是要求下面的式子
\(dp[i][j+1]=(dp[i-1][j]+dp[i][j]) mod 2\)
(第\(i\)个字符在\(j\)秒时的状态,1要特判)
对于1与0的乘法运算其实与&一致
(按道理OJ应该自己会优化的吧。。)
/*H E A D*/
struct Matrix{
ll mt[111][111],r,c;
void init(int rr,int cc,bool flag=0){
r=rr;c=cc;
memset(mt,0,sizeof mt);
if(flag) rep(i,1,r) mt[i][i]=1;
}
Matrix operator * (const Matrix &rhs)const{
Matrix ans; ans.init(r,rhs.c);
rep(i,1,r){
rep(j,1,rhs.c){
int t=max(r,rhs.c);
rep(k,1,t){
ans.mt[i][j]+=(mt[i][k]&rhs.mt[k][j]);
ans.mt[i][j]=ans.mt[i][j]&1;
}
}
}
return ans;
}
};
Matrix fpw(Matrix A,ll n){
Matrix ans;ans.init(A.r,A.c,1);
while(n){
if(n&1) ans=ans*A;
n>>=1;
A=A*A;
}
return ans;
}
ll n;
char str[112];
int main(){
while(~iin(n)){
s1(str);
int len = strlen(str+1);
Matrix A; A.init(len,len);
rep(i,2,len) A.mt[i][i-1]=A.mt[i][i]=1;
A.mt[1][1]=A.mt[1][len]=1;
Matrix b; b.init(len,1);
rep(i,1,len) b.mt[i][1]=str[i]-‘0‘;
Matrix res=fpw(A,n); res=res*b;
rep(i,1,len) str[i]=res.mt[i][1]+‘0‘;
printf("%s\n",str+1);
}
return 0;
}