成群的细菌

来源:互联网 发布:光谷数据 编辑:程序博客网 时间:2024/04/28 03:31
  • 题意(原题):
    n个数,m个操作,操作分6种,时间t。每刻进行一个操作,循环进行。 求最后每个数的值。
    操作分别有清空、翻多倍、给另一个数加上某数的值、清空某数并给另一个数加上某数的值、第i个数的值变为第i+1个的值(n变为1的值)。

  • 思路:
    类似点的变换但还需要用到矩阵快速幂。

  • 代码:

#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#define GETMOD %Modusing namespace std;long long n,m,t,Mod;char ss[10];struct node{    long long xcnt,ycnt,a[110][110];    node()    {        xcnt=ycnt=0;memset(a,0,sizeof(a));    }    void setxy(long long x,long long y)    {        xcnt=x;ycnt=y;    }}opts[21];node cf(node x,node y){    node ans;ans.setxy(x.xcnt,y.ycnt);    for(long long i=1;i<=ans.xcnt;i++)        for(long long j=1;j<=ans.ycnt;j++)            for(long long k=1;k<=x.ycnt;k++)                ans.a[i][j]=(ans.a[i][j]+x.a[i][k]*y.a[k][j]GETMOD)GETMOD;    return ans;}node dw(long long x){    node ans;ans.setxy(x,x);    for(long long i=1;i<=x;i++)ans.a[i][i]=1;    return ans;}node sw(long long x){    node ans;ans.setxy(n,n);    for(long long i=1;i<=n;i++)        if(i!=x)ans.a[i][i]=1;    return ans;}node fl(long long x,long long y){    node ans;ans.setxy(n,n);    for(long long i=1;i<=n;i++)        if(i!=x)ans.a[i][i]=1;        else ans.a[i][i]=y;    return ans;}node fz(long long x,long long y){    node ans;ans.setxy(n,n);    for(long long i=1;i<=n;i++)ans.a[i][i]=1;    ans.a[y][x]=1;    return ans;}node zy(long long x,long long y){    node ans;ans.setxy(n,n);    for(long long i=1;i<=n;i++)if(i!=x)ans.a[i][i]=1;    ans.a[y][x]=1;    return ans;}node jh(long long x,long long y){    node ans;ans.setxy(n,n);    for(long long i=1;i<=n;i++)if(i!=x&&i!=y)ans.a[i][i]=1;    ans.a[x][y]=1;    ans.a[y][x]=1;    return ans;}node alljh(){    node ans;ans.setxy(n,n);ans.a[1][n]=1;    for(long long i=1;i<=n;i++)ans.a[i][i-1]=1;    return ans;}node power(node x,long long k){    node ans=dw(x.xcnt);    while(k)    {        if(k&1)ans=cf(ans,x);        x=cf(x,x);        k/=2;    }    return ans;}int main(){    node opt;    scanf("%lld%lld%lld%lld",&n,&m,&t,&Mod);    for(long long i=1;i<=m;i++)    {        long long x,y;        scanf("%s%lld%lld",ss+1,&x,&y);        if(ss[1]=='d')            opts[i]=sw(x);        if(ss[1]=='r')            opts[i]=fl(x,y);        if(ss[1]=='c')            opts[i]=fz(y,x);        if(ss[1]=='t')            opts[i]=zy(y,x);        if(ss[1]=='s')            opts[i]=jh(x,y);        if(ss[1]=='m')            opts[i]=alljh();        if(i==1)opt=opts[i];        else opt=cf(opts[i],opt);    }    opt=power(opt,t/m);    for(long long i=1;i<=t%m;i++)        opt=cf(opts[i],opt);    node ans;ans.setxy(n,1);    for(long long i=1;i<=n;i++)ans.a[i][1]=1;    ans=cf(opt,ans);    for(long long i=1;i<=n;i++)printf("%lld ",ans.a[i][1]);    return 0;}
原创粉丝点击