1003: 狗狗和花生
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 10 Solved: 4
[ Submit][ Status][ Web Board]
Description
有n只狗狗,为了训练狗狗玩花生的能力,主人制定了三种命令:
1.g i:表示第i只狗狗得到一颗花生
2.e i:表示让第i只狗狗吃掉它得到的所有花生
3.s i j:表示让第i只狗狗和第j只狗狗交换各自的花生
主人给定了k个命令,作为一套命令,为了巩固训练效果,狗狗们需要将这套命令重复m遍……
Input
先输入T,表示输入T个测试数据,对于每个测试数据:
第1行:整数n,m,k(n<=10,m<=10^10,k<=100)
第2--k+1行:表示一套命令的每个命令,每个命令通过题目中(1,2,3)的语句给出
Output
对于每个测试数据,输出一行,有n个数,表示将命令重复m遍后,第1至n只狗狗最后手里的花生数,相邻两个数用一个空格隔开。
Sample Input
1 3 1 6 g 1 g 2 g 2 s 1 2 g 3 e 2
Sample Output
2 0 1
矩阵快速幂,构造矩阵求解
#include<stdio.h>
#include<string.h>
int a[105][105],b[105][105],c[105][105],n,m;
void mul()
{
int i,j,k;
memset(b,0,sizeof(b));
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
for(k=0;k<=n;k++)
b[i][j]+=c[i][k]*a[k][j];
memcpy(c,b,sizeof(b));
}
void mul2()
{
int i,j,k;
memset(b,0,sizeof(b));
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
for(k=0;k<=n;k++)
b[i][j]+=a[i][k]*a[k][j];
memcpy(a,b,sizeof(b));
}
void qm()
{
while(m)
{
if(m&1) mul();
mul2();
m>>=1;
}
}
int main()
{
int T,k,i,j,p,q,tmp;
char op[5];
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
memset(a,0,sizeof(a));
for(i=0;i<=n;i++)
{a[i][i]=1;c[i][i]=1;}
for(i=0;i<k;i++)
{
scanf("%s%d",op,&p);
switch(op[0])
{
case 'g':a[n][p-1]++;break;
case 'e':for(j=0;j<=n;j++) a[j][p-1]=0;break;
case 's':scanf("%d",&q);for(j=0;j<=n;j++){tmp=a[j][p-1];a[j][p-1]=a[j][q-1];a[j][q-1]=tmp;}
}
}
qm();
printf("%d",c[n][0]);
for(i=1;i<n;i++)
printf(" %d",c[n][i]);
printf("\n");
}
return 0;
}