HDU - 2276 位运算矩阵快速幂

挺有意思的一道题
要会运用一些常见的位运算操作进行优化
题目的本质就是要求下面的式子
\(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;
}
posted @ 2018-02-15 18:17  Caturra  阅读(157)  评论(0编辑  收藏  举报