码迷,mamicode.com
首页 > 其他好文 > 详细

HDU - 2276 位运算矩阵快速幂

时间:2018-02-15 18:28:06      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:int   字符   目的   main   size   oid   lag   有意思   amp   

挺有意思的一道题
要会运用一些常见的位运算操作进行优化
题目的本质就是要求下面的式子
\(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 位运算矩阵快速幂

标签:int   字符   目的   main   size   oid   lag   有意思   amp   

原文地址:https://www.cnblogs.com/caturra/p/8449689.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!