题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=15516
题意:
f(1)=1,f(2)=1,f(n)=(A * f(n - 1) + B * f(n - 2)) mod 7.
给你一个A,B和n,你需要求出f(n)的值。(1<=A,B<=1000,1<=n<=100,000,000)
输入3个0,程序结束。
案例:
input
1 1 3
1 2 3
0 0 0
output
2
5
思路分析:
n的范围过大,根本没办法直接循环,这就需要去找规律。
进行部分输出可发现,经过49个数是一个循环,这样只需找出每次案例的前49个数,再求出n%49的值,找出所要得的数的位置。输出f[n%49-1]即可。
源代码如下:
1 #include<iostream> 2 #define max 100000000 3 using namespace std; 4 int main() 5 { 6 int A,B,n,f[49]; 7 cin>>A>>B>>n; 8 f[0]=1;f[1]=1; 9 while(A!=0&&B!=0&&n!=0) 10 { 11 for(int i=2;i<49;i++) 12 f[i]=(A*f[i-1]+B*f[i-2])%7; 13 cout<<f[n%49-1]<<endl; 14 cin>>A>>B>>n; 15 } 16 return 0; 17 }