UVA 1386 Cellular Automaton

Posted Fighting Heart

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA 1386 Cellular Automaton相关的知识,希望对你有一定的参考价值。

矩阵快速幂。

样例是这样构造矩阵的:

技术分享

矩阵很好构造,但是500*500*500*logk的复杂度显然是无法通过这题的。

其实本题构造出来的矩阵是一个循环矩阵,只需直到第一行或者第一列,即可直到整个矩阵是怎么样的。

所以,中间计算的时候,需要直到第一行是什么即可,即1*n的矩阵乘n*n的矩阵。时间复杂度o(n*n*logk)

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;

const int maxn=500+10;
int n,d,k;
long long mod;
long long z[maxn],a[maxn];
long long y[maxn],x[maxn];
long long tmp[maxn][maxn];
long long r[maxn];

void init()
{
    memset(y,0,sizeof y);
    y[1]=1;
    memset(x,0,sizeof x);
    x[1]=1;
    for(int i=2; i<=1+d; i++) x[i]=1;
    for(int i=n; i>=n-d+1; i--)x[i]=1;
}

int main()
{
    while(~scanf("%d%lld%d%d",&n,&mod,&d,&k))
    {
        for(int i=1; i<=n; i++) scanf("%lld",&z[i]);
        init();
        while(k)
        {
            for(int i=1; i<=n; i++)
            {
                int tot=1;
                for(int j=i; j<=n; j++) tmp[i][j]=x[tot++];
                for(int j=1; j<=i-1; j++) tmp[i][j]=x[tot++];
            }

            if(k%2==1)
            {
                for(int j=1; j<=n; j++)
                {
                    long long sum=0;
                    for(int t=1; t<=n; t++) sum=(sum+(y[t]*tmp[j][t])%mod)%mod;
                    r[j]=sum;
                }

                for(int j=1; j<=n; j++) y[j]=r[j];

                k--;
            }
            else if(k%2==0)
            {
                for(int j=1; j<=n; j++)
                {
                    long long sum=0;
                    for(int t=1; t<=n; t++) sum=(sum+(x[t]*tmp[j][t])%mod)%mod;
                    r[j]=sum;
                }
                for(int j=1; j<=n; j++) x[j]=r[j];

                k=k/2;
            }
        }

        for(int i=1; i<=n; i++)
        {
            int tot=1;
            for(int j=i; j<=n; j++) tmp[i][j]=y[tot++];
            for(int j=1; j<=i-1; j++) tmp[i][j]=y[tot++];
        }

        for(int j=1; j<=n; j++)
        {
            long long sum=0;
            for(int t=1; t<=n; t++) sum=(sum+(z[t]*tmp[j][t])%mod)%mod;
            r[j]=sum;
        }

        for(int j=1; j<=n; j++)
        {
            printf("%d",r[j]);
            if(j<n) printf(" ");
            else printf("\n");
        }
    }
    return 0;
}

 

以上是关于UVA 1386 Cellular Automaton的主要内容,如果未能解决你的问题,请参考以下文章

UVa 620 Cellular Structure(DP)

UVa1386

poj 3150Cellular Automaton 矩阵

在 iOS 中通过 Cellular 进行跟踪时获取错误坐标

POJ - 3150 :Cellular Automaton(特殊的矩阵,降维优化)

POJ3150—Cellular Automaton(循环矩阵)