ZZY的宠物

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
#include <stdio.h>
#include <string.h>
#define mod 10000

struct Mat
{
    int matrix[6][6];
}mat;
int f[40],n;

Mat mul(Mat a,Mat b)
{
    int i,j,k;
    Mat c;
    for(i=0; i<6; i++)
        for(j=0; j<6; j++)
        {
            c.matrix[i][j] = 0;
            for(k=0; k<6; k++)
            {
                c.matrix[i][j] += a.matrix[i][k] * b.matrix[k][j];
                c.matrix[i][j] %= mod;
            }
        }
    return c;
}
Mat solve(int m)
{
    Mat mt;
    if(m==1) return mat;
    if(m & 1) return mul(solve(m-1),mat);
    else
    {
        mt = solve(m/2);
        return mul(mt,mt);
    }
}

int main()
{
    //freopen("in.txt","r",stdin);
    int cnt=1,s,i;
    while(scanf("%d",&n)!=EOF)
    {
        memset(mat.matrix,0,sizeof(mat.matrix));
        for(i=0; i<5; i++) mat.matrix[i][i+1]=1;
        mat.matrix[5][2]=1;
        mat.matrix[5][3]=2;
        mat.matrix[5][4]=3;
        s=0;
        printf("Case %d: ",cnt++);
        if(n==0) puts("2");
        else if(n==1) puts("2");
        else if(n==2) puts("8");
        else if(n==3) puts("12");
        else if(n==4) puts("32");
        else
        {
            for(i=0; i<6; i++)  s= (s+2*solve(n-i).matrix[5][5] )% mod;
            printf("%d\n",s);
        }
    }
    return 0;
}
找规律+快速幂矩阵

 

posted @ 2013-09-03 22:46  1002liu  阅读(157)  评论(0编辑  收藏  举报