数字序列

来源:互联网 发布:全面战争系列优化渣 编辑:程序博客网 时间:2024/05/16 00:36

数字序列:
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 31 2 100 0 0
 

Sample Output
25

因为f(n)只有七中取值0-6,系数a对应7个,b对应7个,A * f(n - 1) + B * f(n - 2)) 只有49个不同值,为一个周期,只要开一个数组储存这49个值mod 7的余数就好了,然后用n%49,来算。

在百度copy一份别人的思想:

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int arr[10000];   
  5.    
  6. int main()  
  7. {  
  8.     int A,B,n;  
  9.     arr[1] = arr[2] = 1;  
  10.     while(cin>>A>>B>>n, A || B || n)  
  11.     {  
  12.         int i;  
  13.         for(i=3; i<10000 ;i++)  
  14.         {  
  15.             arr[i] = (A*arr[i-1] + B*arr[i-2]) % 7;  
  16.               
  17.             //如果有两个连着 =1,则后面的全部和前面相同,即出现了周期  
  18.             //这时就没必要再进行下去了,跳出循环, i-2为周期   
  19.             if(arr[i] == 1 && arr[i-1] == 1)              
  20.                 break;  
  21.         }  
  22.         n = n % (i-2);  
  23.           
  24.         // 把n对周期求模,当n = i-2时, n=0,此时本来应该取arr[i-2]的,所以把arr[0]=arr[i-2]   
  25.         //也可以这样:  
  26.         //if(n==0)   n=i-2;                  
  27.         arr[0] = arr[i-2];    
  28.         cout << arr[n] << endl;  
  29.     }  
  30.     return 0;  
  31. }  
真难啊:

 #include<stdio.h> 
  
int arr[10000];   
   
int main()  
{  
    int A,B,n;  
    arr[1] = arr[2] = 1;  
    while(scanf("%d %d %d",&A,&B,&n), A || B || n)  
    {  
        int i;  
        for(i=3; i<10000 ;i++)  
        {  
            arr[i] = (A*arr[i-1] + B*arr[i-2]) % 7;  
              
            //如果有两个连着 =1,则后面的全部和前面相同,即出现了周期  
            //这时就没必要再进行下去了,跳出循环, i-2为周期   
            if(arr[i] == 1 && arr[i-1] == 1)              
                break;  
        }  
        n = n % (i-2);  
          
        // 把n对周期求模,当n = i-2时, n=0,此时本来应该取arr[i-2]的,所以把arr[0]=arr[i-2]   
        //也可以这样:  
        //if(n==0)   n=i-2;                  
        arr[0] = arr[i-2];  
printf("%d\n",arr[n]);  
    }  
    return 0;  
}