http://acm.hdu.edu.cn/showproblem.php?pid=1005
Number Sequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 98759 Accepted Submission(s): 23721
Problem Description
A number sequence is defined as follows:
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
Given A, B, and n, you are to calculate the value of f(n).
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
Given A, B, and n, you are to calculate the value of f(n).
Input
The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.
Output
For each test case, print the value of f(n) on a single line.
Sample Input
1 1 3 1 2 10 0 0 0
Sample Output
2 5
f数列的加强版,涉及到找循环节以及数的模运算
(a + b) % p = (a % p + b % p) % p
(a - b) % p = (a % p - b % p) % p
(a * b) % p = (a % p * b % p) % p
(a^b) % p = ((a % p)^b) % p
使用后面的式子可以减少溢出
#include<stdio.h> int main(){ // freopen("in.txt","r",stdin); int a,b,n; while(scanf("%d%d%d",&a,&b,&n)!=EOF){ if(a==0&&b==0&&n==0){ break; } int start=0; int size=0; bool find=false; int f[100]; for(int i=1;i<100;i++){ if(i==1||i==2){ f[i]=1; } else{ f[i]=(a*f[i-1]%7+b*f[i-2]%7)%7; //找寻环节不能认为是11开始的,因为有1100000000...的情况 //找循环节,例如计算f[i]时,遍历f找和f[i],f[i-1]相等的 //如果有,则找到,如果没有,则继续寻找 for(int j=2;j<i;j++){ if(f[j]==f[i]&&f[j-1]==f[i-1]){ start=j-1; size=i-2; find=true; break; } } if(find){ break; } } } if(start==1){ int ans=n%size; if(ans==0){ ans=size; } printf("%d\n",f[ans]); }else{ if(n<start){ printf("%d\n",f[n]); }else{ size=size-start+1; int ans=(n-start+1)%size; if(ans==0){ printf("%d\n",f[start+size-1]); } else{ printf("%d\n",f[start+ans-1]); } } } } return 0; }