首页 > 其他 > 详细

HDU2276 Kiki & Little Kiki 2

时间:2020-07-22 23:15:58      阅读:64      评论:0      收藏:0      [点我收藏+]

题目大意:

  给出一段只含序列‘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;
    }
}

 

HDU2276 Kiki & Little Kiki 2

原文:https://www.cnblogs.com/xuanzo/p/13363282.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!