ZZY的宠物
描述
ZZY领养了一对刚刚出生的不知名小宠物..巨萌巨可爱!!...小宠物的生命为5个单位时间并且不会在中间出意外翘辫子(如: 从0出生能活到5但活不到6)..小宠物经过2个单位时间成熟..刚刚成熟的一对小宠物能立即生育6只新的小宠物(如: 从0出生的一对在2时成熟并进行第一次生育)...小宠物是很忠诚的..不会在中途换伴侣..每对小宠物生育一次这一对的生育能力就会降低2个..也就是说一对小宠物在第二次生育时就只能生4个了..小宠物成熟后每个单位时间都会尽力的生育(例: 从0出生的一对..2时间生6个..3时间生4个..4时间生2个...5时间生不出..6时间这一对已经挂了..)..生育出来的新小宠物会继续这个过程..
ZZY想知道从单位时间0开始..经过M个单位时间(时间为M时)将有多少只活着的小宠物(0时刻有2只小宠物)
因为ZZY隐隐地觉得什么地方怪怪的...所以请将这个数目mod 10000
输入
多组数据读到EOF
每组数据一行:
M ( 0<=M<=2000000000 )
最多500组数据
输出
每组输出一行为 Case 组号: 答案,即M时刻活着的小宠物个数%10000
样例输入
0
1
2
3
4
8
样例输出
Case 1: 2
Case 2: 2
Case 3: 8
Case 4: 12
Case 5: 32
Case 6: 528
题目分析:这是此次比赛的第五题,题目讲的是最开始有一对宠物,它们每过两个时间会再繁殖6个,接着是四个,以此类推,小鼠最多只能活6个时间。问M时刻有多少宠物活着。这道题可以先列出一个表格,然后找到规律,用循环来解决。下面是代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
struct Matrix
{
int s[6][6];
}h,p,a;
int m,T,ans,k;
void output(Matrix h)
{
printf("-------------------------\n");
for (int i=0;i<6;i++)
{
for (int j=0;j<6;j++) printf("%d ",h.s[i][j]);
printf("\n");
}
printf("-------------------------\n");
}
Matrix Mul(Matrix a,Matrix b)
{
int i,j,k;
Matrix h;
memset(h.s,0,sizeof(h.s));
for (k=0;k<6;k++)
for (i=0;i<6;i++)
for (j=0;j<6;j++)
h.s[i][j]=(h.s[i][j]+a.s[i][k]*b.s[k][j])%10000;
return h;
}
Matrix Mdata(int n)
{
Matrix k;
if (n==1) return h;
k=Mdata(n/2);
k=Mul(k,k);
if (n%2) k=Mul(k,h);
return k;
}
int main()
{
T=0;
memset(a.s,0,sizeof(a.s));
a.s[5][0]=2;
memset(h.s,0,sizeof(h.s));
for (int i=0;i<6;i++) h.s[i][i+1]=1;
h.s[5][2]=1; h.s[5][3]=2; h.s[5][4]=3;
while (~scanf("%d",&m))
{
ans=0;
k=6;
while (k--)
{
if (m) p=Mul(Mdata(m),a); else p=a;
ans+=p.s[5][0];
if (!m) break;
m--;
}
printf("Case %d: %d\n",++T,ans%10000);
}
return 0;
}