hdu 2276(矩陣快速冪)
阿新 • • 發佈:2018-12-09
題意:n個燈排成環,1的左邊是n,其他i號燈的左邊是i-1號,給定燈的初始狀態,每秒每個左邊的燈為1 的燈改變狀態。
影響第i個燈的狀態就是他左邊的燈和他本身,所以遞推式如下
(圖源百度)
#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<queue> #include<map> #include<cmath> #include<stack> #include<set> #include<vector> #include<algorithm> #define LL long long #define inf 1<<30 using namespace std; int MAXN; int mod; struct Matrix { int mat[150][150]; Matrix() {} Matrix operator*(Matrix const &b)const { Matrix res; memset(res.mat, 0, sizeof(res.mat)); for (int i = 1 ;i <=MAXN; i++) for (int j = 1; j <= MAXN; j++) for (int k = 1; k <=MAXN; k++) res.mat[i][j] = (res.mat[i][j]+this->mat[i][k] * b.mat[k][j])%mod; return res; } }; Matrix pow_mod(Matrix base, int n) { Matrix res; memset(res.mat, 0, sizeof(res.mat)); for (int i = 1; i <=MAXN; i++) res.mat[i][i] = 1; while (n > 0) { if (n & 1) res = res*base; base = base*base; n >>= 1; } return res; } char s[150]; int main() { int n,k,m; Matrix base,a; while(~scanf("%d",&m)) { scanf("%s",s); n=strlen(s); mod=2; MAXN=n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) base.mat[i][j]=0; base.mat[1][1]=1; base.mat[1][n]=1; for(int i=2;i<=n;i++) for(int j=1;j<=n;j++) { if(i==j) { base.mat[i][j]=1; base.mat[i][j-1]=1; } } Matrix ans=pow_mod(base,m); for(int i=1;i<=n;i++) { int sum=0; for(int j=0;j<n;j++) sum=(sum+ans.mat[i][j+1]*(s[j]-'0'))%mod; printf("%d",sum); } printf("\n"); } }