1. 程式人生 > 實用技巧 >HDU2276 Kiki & Little Kiki 2

HDU2276 Kiki & Little Kiki 2

題目大意:

  給出一段只含序列'0'和'1'的序列,形成一個圓環,以及時間M,每結果1單位時間,如果a[i-1]==1(當i==0時,i-1為n-1),則a[i]^=1;

求M時間後的序列


中間有一段寫錯了,搜了部落格才知道原來是對2取模,我理解成不是1就是0


AC程式碼:

#include<iostream>
#include<cstring>
using namespace std;
#define ll long long
const int maxn=105;
const int mod=10000;
int T,n;
struct matrix{
    int
a[maxn][maxn]; matrix(){ memset(a,0,sizeof(a)); } }; matrix mul(matrix a,matrix b){ matrix res; for(int i=0;i<n;i++) for(int j=0;j<n;j++){ for(int k=0;k<n;k++) res.a[i][j] = (res.a[i][j] + a.a[i][k] * b.a[k][j]); res.a[i][j]
%=2;//淦,搜了部落格才知道這裡錯了,居然是%2,還以為除了1以外全是0; } return res; } matrix qpow(matrix A,ll m){//方陣A的m次冪 matrix ans; /*for(int i=0;i<n;i++){ for(int j=0;j<n;j++) cout<<A.a[i][j]<<' '; cout<<endl; }*/ for(int i=0;i<n;i++) ans.a[i][i]
=1; //單位矩陣 while(m){ if(m&1)ans=mul(ans,A); A=mul(A,A); m>>=1; } return ans; } int main(){ while(cin>>T){ char s[105]; cin>>s; n = strlen(s); matrix m,cnt; for(int i=0;i<n;i++){ m.a[0][i]=s[i]-'0'; } for(int i=0;i<n;i++){ cnt.a[i][i]=1;cnt.a[(i-1)>=0?(i-1):(n-1)][i]=1; } matrix res = mul(m,qpow(cnt,T)); for(int i=0;i<n;i++) cout<<res.a[0][i]; cout<<endl; } }