ZZY的宠物
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 10 Solved: 3
Description
Input
Output
Sample Input
Sample Output
HINT
Source
这道题做了有几天了,现在写解题报告算是回顾下吧。
这题收获最大的是让我知道了矩阵的一些用法。。
题目的数据还是比较好推的,可以试着写一下:
刚出生 出生1天 出生2天 出生3天 出生4天 出生5天
2 0 0 0 0 0(初始状态2只刚出生的宠物)
0 2 0 0 0 0(1天后)
6 0 2 0 0 0(2天后)(6=2*3+0*2+0*1)
4 6 0 2 0 0(3天后)(4=0*3+2*2+0*1)
20 4 6 0 2 0 (4天后)(20=6*3+0*2+2*1)
24 20 4 6 0 2(5天后)(24=4*3+6*2+0*1)
……
这便能看出规律。
若初始状态是矩阵A:
2 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
每次变化则是将矩阵A乘以如下矩阵B:
1 0 0 0 0 0
3 1 0 0 0 0
2 0 1 0 0 0
1 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
当输入n时只需求A*B^n,这样得出的矩阵第一行求和便是我们要求的结果。当然数据大的时候还是需要用到矩阵的快速幂。。
#include<iostream>
using namespace std;
int mm[6][6];
int nn[6][6];
int i,j,k,n,m,l,sum;
void ml(int nnn[6][6],int mmm[6][6])
{
int z[6][6];
for (k=0;k<6;k++)
for (i=0;i<6;i++)
z[k][i]=0;
for (k=0;k<6;k++)
for (i=0;i<6;i++)
for (j=0;j<6;j++)
z[i][j]=(z[i][j]+mmm[i][k]*nnn[k][j])%10000;
for (k=0;k<6;k++)
for (i=0;i<6;i++)
mmm[k][i]=z[k][i];
}
int main()
{
int M,s=1;
int mm[6][6];
int nn[6][6];
while (cin>>M)
{
for(i=0;i<=5;i++)
for(j=0;j<=5;j++)
{mm[i][j]=0;nn[i][j]=0;}
mm[0][0]=2;sum=0;
nn[0][1]=1;nn[1][2]=1;nn[2][3]=1;nn[3][4]=1;nn[4][5]=1;
nn[1][0]=3;nn[2][0]=2;nn[3][0]=1;
while(M)
{
if(M&1)
ml(nn,mm);
M>>=1;
ml(nn,nn);
}
for (k=0;k<6;k++) sum+=(mm[0][k])%10000;
cout<<"Case "<<s++<<": "<<sum%10000<<endl;
}
return 0;
}