zoukankan      html  css  js  c++  java
  • 矩阵快速幂之Kiki & Little Kiki 2

    题意是:给出一串01串,每一秒,每个位置得灯会根据左边那个灯得状态进行改变,(第一个得左边为最后一个)如果左边为1,那么自己就会改变状态,左边为0则不用,问n秒改01串的状态

    /////

    首先,我们发现,a【2】=(a[1]+a[2])%2;,

    可以用矩阵快速幂来算出结果。

    同时我们发现

    (1+1)%2和1^1结果一样,1*1和1&1结果一样,所以相乘函数改下就行了

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int mod=1024;
    char str[110];
    int len;
    struct node{
    int a[101][101];
    };
    node a,ans,b;
    void init()
    {
    ///我们令f(i)=A*f(i-1)+B*f(i-2);下面举例A=3,B=2;
    memset(a.a,0,sizeof(a.a));
    for(int i=1;i<len;i++) a.a[i][i]=a.a[i][i-1]=1;
    a.a[0][0]=a.a[0][len-1]=1;
    }
    node mat(node x,node y)
    {
    node c;
    for(int i=0;i<len;i++)
    for(int j=0;j<len;j++)
    c.a[i][j]=0;
    for(int i=0;i<len;i++)
    for(int j=0;j<len;j++)
    for(int k=0;k<len;k++)
    c.a[i][j]=c.a[i][j]^(1ll*x.a[i][k]&y.a[k][j]);
    // printf("yes\n");
    return c;
    }
    int main()
    {
    ll n;
    int T;
    while(~scanf("%d%s",&n,str)){
    len=strlen(str);
    init();
    for(int i=0;i<len;i++)///
    for(int j=0;j<len;j++)///
    b.a[i][j]=0;///
    for(int i=0;i<len;i++)///这里就只是为下面快速幂提供用的
    b.a[i][i]=1;
    while(n){
    if(n&1) b=mat(b,a);
    a=mat(a,a);
    n>>=1;
    }

    for(int i=0;i<len;i++){
    ans.a[i][0]=str[i]-'0';
    }
    ans=mat(b,ans);
    for(int i=0;i<len;i++)
    cout<<ans.a[i][0];
    cout<<endl;
    }
    return 0;
    }

  • 相关阅读:
    c++中sort()及qsort()的用法总结
    POJ的层次感分类
    DFS练习-HDU1010
    Dijkstra&&Floyd
    DFS练习一---HDU 1342
    快速幂取模算法
    树的实现
    C++的队列和pair
    BFS练习-POJ.2386
    Codeforces 1139E(二分图最大匹配)
  • 原文地址:https://www.cnblogs.com/hgangang/p/11506510.html
Copyright © 2011-2022 走看看