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; }