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;
}

转载于:https://www.cnblogs.com/caturra/p/8449689.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值