且未

博客园 首页 新随笔 联系 订阅 管理

题目

第一次做的时候用的递归,意料之中(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;
}


posted on 2018-02-06 20:27  阿聊  阅读(91)  评论(0编辑  收藏  举报