hdu 1005 Number Sequence

题目

第一次做的时候用的递归,意料之中( n最大可以达到100,000,000),超时超内存。
#include<stdio.h>
int A,B;
int func(int n)
{
    if(n==1||n==2) return 1;
   return  (A*func(n-1)+B*func(n-2))%7;
}
int main()
{
    int n;
   while(~ scanf("%d%d%d",&A,&B,&n),A,B,n)
   {
     printf("%d",  func(n));
   }
    return 0;
}
so ,要找规律,怎么找呢?不知道,所以百度之。。。
前两个等于1,所以后面如果有两个连着的1出现,那就是出现周期了
#include<stdio.h>
int A,B;
int func[50];
int main()
{
    int n,i;
    func[1]=func[2]=1;
   while(~ scanf("%d%d%d",&A,&B,&n),A,B,n)
   {
     for( i=3;i<50;i++)
     {
          //如果有两个连着 =1,则后面的全部和前面相同,即出现了周期  
        //这时就没必要再进行下去了,跳出循环, i-2为周期   
         func[i]= (A*func[i-1]+B*func[i-2])%7;
         if(func[i]==1&&func[i-1]==1)
         {
             break;
         }
     }
     n=n%(i-2);
     // 把n对周期求模,当n = i-2时, n=0,此时本来应该取func[i-2]的,所以把func[0]=func[i-2]   
    //也可以这样:  
    //if(n==0)   n=i-2; 
     func[0]=func[i-2];
     printf("%d\n",func[n]);
   }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值