CCNUOJ 1003 狗狗和花生

1003: 狗狗和花生

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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;
}

  

原文地址:https://www.cnblogs.com/laputa/p/2121617.html