1. 程式人生 > >HDU - 2276 位運算矩陣快速冪

HDU - 2276 位運算矩陣快速冪

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 位運算矩陣快速冪