zzy 的宠物 典型的矩阵乘法 二分+递归

探讨了由一对小宠物经过特定繁殖周期后的存活数量计算方法,通过矩阵运算实现时间推演,模运算确保结果在指定范围内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ZZY的宠物

Time Limit: 1000MS

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隐隐地觉得什么地方怪怪的...所以请将这个数目mod10000

Input

    多组数据读到EOF

    每组数据一行: 

    M ( 0<=M<=2000000000 )

    最多500组数据

Output

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

SampleInput

0

1

2

3

4

8

SampleOutput

Case 1: 2

Case 2: 2

Case 3: 8

Case 4: 12

Case 5: 32

Case 6: 528


Source

ZZY原创的说..


Case 1: 2

Case 2: 2

Case 3: 8

Case 4: 12

Case 5: 32

Case 6: 528

SourcZZY原创的说..

队长威武

今天做了一道队长出的zzy的宠物 这道题 直接无语了 忘记了赋值 直接悲剧了 ~~~ 整了一晚上 果断被坑了  


#include<stdio.h>
#include<string.h>
struct node{
            int a[7][7];
            int flag;
            node(){ 
                   memset(a,0,sizeof(a));
                   a[1][2]=3;
                   a[1][3]=2;
                   a[1][4]=a[2][1]=a[3][2]=a[4][3]=a[5][4]=a[6][5]=1;
                   }
          }ju,jubase;   //矩阵的初始化
          
struct nod{
           int ans[6];
             nod(){
           ans[0]=2;
                  } 
         } ;
int function(node p,node q,int n,int m )  //矩阵的运算
{
    int t=p.a[n][1]*q.a[1][m] + p.a[n][2]*q.a[2][m] + p.a[n][3]*q.a[3][m] + p.a[n][4]*q.a[4][m] + p.a[n][5]*q.a[5][m] + p.a[n][6]*q.a[6][m];
    return t%10000;
   
}

node matrix(node p,node q)   //矩阵的运算
{
    node t;
    int i,j;
    for( i=1; i<=6; i++ )     
       for( j=1; j<=6; j++)
       {
         t.a[i][j] = function( p, q, i, j);
       }
       
     return t;     
}         
         
node fun(int n)    //矩阵的运算

{       int i,j;
        if(n==1)return jubase;
        ju=fun(n/2);
        ju=matrix(ju,ju);
        if(n%2==1) ju=matrix(ju,jubase);   //这里忘记了给ju这个结构体变量赋值
        return ju;   //注意要有返回值
}


int func(node p,nod q,int n)    //矩阵的运算

{
    int t=p.a[n][1]*q.ans[0] + p.a[n][2]*q.ans[1] + p.a[n][3]*q.ans[2] + p.a[n][4]*q.ans[3] + p.a[n][5]*q.ans[4] + p.a[n][6]*q.ans[5];
    return t%10000;    
}

nod mutiply( node p, nod q)
{
   nod t;
   int i;
   for(i=0;i<=5;i++)
   t.ans[i]=func( p, q,i+1)  ;  
   return t;    //忘记了返回值了 
     
}


int main()
{  
     int n;
     int i,j;   
     while( scanf("%d",&n)!=EOF )   
     {
           if(n==0){printf("2\n");continue;}      //注意0的这种赋值
           ju=fun(n);
           
           nod base;
           base=mutiply(ju,base);
           int sum=0;
           
           printf("%d\n",sum%10000);
     }
    
    
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值