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