#include<stdio.h>
struct node
{
long long int d[100+16][100+16];
}Matrix;
long long int N,M,K;
struct node multi(struct node a,struct node b)
{
struct node x;
int i,j,k;
for(i=0;i<=N;i++)
for(j=0;j<=N;j++)
x.d[i][j]=0;
for(i=0;i<=N;i++)
{
for(k=0;k<=N;k++)
{
if(a.d[i][k])
{
for(j=0;j<=N;j++)
x.d[i][j]+=a.d[i][k]*b.d[k][j];
}
}
}
return x;
}
struct node qmulti(struct node a,int p)
{
struct node x;
int i,j;
for(i=0;i<=N;i++)
for(j=0;j<=N;j++)
{
if(i==j)
x.d[i][j]=1;
else
x.d[i][j]=0;
}
while(p)
{
if(p&1)
x=multi(x,a);
p>>=1;
a=multi(a,a);
}
return x;
}
int main()
{
struct node x;
int i,j,t,a,b;
char st[5];
while(~scanf("%lld%lld%lld",&N,&M,&K))
{
if(N==0&&M==0&&K==0)
break;
for(i=0;i<=N;i++)
for(j=0;j<=N;j++)
if(i==j)
x.d[i][j]=1;
else
x.d[i][j]=0;
while(K--)
{
scanf("%s",st);
if(st[0]=='g')
{
scanf("%lld",&t);
x.d[t-1][N]++;
}
else
if(st[0]=='e')
{
scanf("%lld",&t);
for(i=0;i<=N;i++)
x.d[t-1][i]=0;
}
else
{
scanf("%lld%lld",&a,&b);
for(i=0;i<=N;i++)
{
t=x.d[a-1][i];
x.d[a-1][i]=x.d[b-1][i];
x.d[b-1][i]=t;
}
}
}
x=qmulti(x,M);
for(i=0;i<N;i++)
printf("%lld ",x.d[i][N]);
printf("\n");
}
}
poj 3735 Training little cats (矩阵快速幂)
最新推荐文章于 2024-07-24 11:54:02 发布