HDU - 2276 位运算矩阵快速幂

Posted The Azure Arbitrator

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于HDU - 2276 位运算矩阵快速幂的主要内容,如果未能解决你的问题,请参考以下文章

hdu 2276 Kiki & Little Kiki 2 矩阵快速幂

HDU2276——Kiki & Little Kiki 2

HDU 2276 Kiki & Little Kiki 2

矩阵快速幂计算hdu1575

POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂

hdu 2604 Queuing dp找规律 然后矩阵快速幂。坑!!