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

题目分析;

      本题主要是说两个宠物从出生到两个时间,会出生6只宠物,然后下一个时间出生4只,第4个时间出生2只,第五个时间为0;第六个时间宠物本省死亡。可以看以下的表格:

                                   x0                  x1                  x2                x 3                     x4             x5

               0                   2                  0                    0                  0                        0                0

               1                   0                 2                     0                  0                        0                0

                2                  6                  0                    2                 0                         0                0

               3                    4                6                    0                 2                         0                 0

                4                  2+6/2*6       4                   6                 0                         2                   0 

                 5                  6+6            20                    4                6                        0                   2

由上表可知,处于0时刻的宠物数量为x2*3+x3*2+x4*1;此后每个时刻宠物的数量为上一时刻宠物所对应的时刻的数量,例如,在第5时刻处于x2的宠物数量为第4时刻处于x2的宠物数量。而且处于x5时刻的宠物,在下一时刻就会死亡,所以不用计入总数。每一时刻的宠物数量为x0+·····+x5;因此可以设置一个一维数组来存储对应时刻x0~x5的宠物数量;

解题代码;

#include<iostream>

using namespace std;
int main()
{
int i=0;
long int M;
while(cin>>M){
long int member[6]={2,0};                   //数组的初始化
i++;
int j;
int num=0;
int num1=0;
for(j=1;j<=M;j++)
{
           num1=(3*member[1]+2*member[2]+member[3])%10000;               //计算x0的值,先储存在num1中
  member[5]=member[4];                                   //后面的数组依次移位

  member[4]=member[3];

  member[3]=member[2];
  member[2]=member[1];
  member[1]=member[0];
  member[0]=num1;
}
for(j=0;j<6;j++)
{
num+=member[j];
}
cout<<"Case "<<i<<": "<<(num%10000)<<endl;       //求模后输出
}
return 0;
}

解题小结:

     本题看起来数据会很大,并且会很麻烦,但是细心观察之后会发现每个数据之间是有相互联系的,只要发现这个规律之后,解决这道题就不是那么难的事情了,关键在于只要在第一次求x0的时候对1000求模,下面的数组是依次移位依次,故不用再对下面数组求模,记得对吼相加之后再次对1000求模即可。所以,对于以后A题,首先了解题目,对题目化简,找出最关键的字句进行推敲,当然还要考虑特殊的数据的处理。

     












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值