ZZY的宠物

 

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

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值