1. 程式人生 > >Number Sequence 【打表】+【找規律】

Number Sequence 【打表】+【找規律】

Number Sequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 63052    Accepted Submission(s): 14475


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).

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
Author CHEN, Shunbao
Source
Recommend JGShining
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
題意: 輸入 A,B,n 求f(n) 思路: 1  可以用陣列來模擬這種遞迴(居然才知道0.0) 2  一看 n 值那麼大,就知道 肯定會超時間按照一般方法 ,所以一定可以另闢蹊徑,所以就想到了,可能會有周期性即迴圈  所以就打表 一看 確實有規律,不過,不同的a,b,週期不同,所以 要打表來記錄 週期   3如果使用陣列或者遞迴都會爆棧,注意到題目中的數都是對7取餘,所以相鄰的兩個數的組合最多有49中,所以最多49次迴圈就會從頭開始迴圈,這是就可以不用繼續執行了,然後將n對i取餘,根據餘數就可以得到結果。
4 在遞迴關係中,如果  連續  兩個數和 之前的 連續 兩個數 相同,那麼由遞迴關係 得到的值一定會是相同的,即一定會有迴圈 程式碼
  1. #include<iostream>
  2. #include<stdio.h>
  3. usingnamespace std;  
  4. int f[100000005];  
  5. int main()  
  6. {  
  7.     int a,b,n,i,j;  
  8.     f[1]=1;f[2]=1;  
  9.     while(scanf("%d%d%d",&a,&b,&n))  
  10.     {  
  11.         int s=0;//記錄週期
  12.         if
    (a==0&&b==0&&n==0) break;  
  13.         for(i=3;i<=n;i++)  
  14.         {  
  15.             f[i]=(a*f[i-1]+b*f[i-2])%7;  
  16.             for(j=2;j<i;j++)  
  17.             if(f[i-1]==f[j-1]&&f[i]==f[j])//  由上述的4得
  18.             {  
  19.                 s=i-j;  
  20.                 //cout<<j<<" "<<s<<" >>"<<i<<endl;
  21.                 break;  
  22.             }  
  23.             if(s>0) break;  
  24.         }  
  25.         if(s>0){  
  26.                  f[n]=f[(n-j)%s+j];  
  27.                  //cout<<"f["<<n<<"]:="<<"f["<<(n-j)%s+j<<"] "<<endl;
  28.                }  
  29.         cout<<f[n]<<endl;  
  30.     }  
  31.     return 0;  
  32. }