HDU - 2276 位運算矩陣快速冪
阿新 • • 發佈:2018-02-15
struct str mod const turn down log line 矩陣快速冪
挺有意思的一道題
要會運用一些常見的位運算操作進行優化
題目的本質就是要求下面的式子
\(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;
}
HDU - 2276 位運算矩陣快速冪