ZZY的宠物

来源:互联网 发布:维棠flv视频软件 编辑:程序博客网 时间:2024/04/27 13:46

ZZY的宠物

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 10  Solved: 3

Description

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 

Input

多组数据读到EOF
每组数据一行:  
M ( 0<=M<=2000000000 )
最多500组数据 

Output

每组输出一行为  Case 组号: 答案,即M时刻活着的小宠物个数%10000

Sample Input

0
1
2
3
4
8

Sample Output

Case 1: 2
Case 2: 2
Case 3: 8
Case 4: 12
Case 5: 32
Case 6: 528

HINT

Source

ZZY

这道题做了有几天了,现在写解题报告算是回顾下吧。

这题收获最大的是让我知道了矩阵的一些用法。。

题目的数据还是比较好推的,可以试着写一下:

刚出生     出生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;}






原创粉丝点击