这道题类似数学中的找规律

不断往前计算f[n],直到出现一组数据(两个相邻的数)和前面的(两个相同的数)相同,那么就形成了循环

 

因为始终mod7,那么每个数字只有0~6  7种可能,两个为一组,最多49种可能,也就是往前计算最坏情况也只要计算49次就好了

 

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 #define N 100
 6 int f[N];
 7 
 8 int main()
 9 {
10    // freopen("a.in" , "r" , stdin);
11     int a , b , k;
12     f[0] = f[1] = f[2] = 1;
13     while(~scanf("%d%d%d" , &a , &b , &k)){
14         if(a == 0 && b == 0 && k == 0) break;
15         int cnt = 2;
16         int l , len;
17         while(1){
18             cnt++;
19             f[cnt] = (a * f[cnt - 1] + b * f[cnt - 2]) % 7;
20             int flag = 0;
21             for(int i = cnt-1 ; i>=2 ; i--){
22                 if(f[i] == f[cnt] && f[i-1] == f[cnt-1]){
23                     l = i-1 , len = cnt - i;
24                     flag = 1;
25                    // printf("the same : %d  %d\n",len,l);
26                    // for(int i = 1 ; i<=cnt ; i++) printf("%d " , f[i]);
27                     break;
28                 }
29             }
30             if(flag) break;
31         }
32         if(k <= cnt) printf("%d\n" , f[k]);
33         else{
34             int index = k-l+1;
35             index = (index-1) % len; //因为是从下标1开始,首先要-1,这样mod后得到0~len-1的范围,实际上为1~len,所以后面再加一
36             index = index + l;
37             printf("%d\n" , f[index]);
38         }
39     }
40     return 0;
41 }

 

 posted on 2014-12-21 17:26  Love风吟  阅读(206)  评论(0编辑  收藏  举报