NYOJ427(数论)

解题思路:由于n的范围在1~100,000,000,所以利用常规的每次保存上次运算结果的方法绝对会TLE。题中mod7,即为解题的突破口,由于mod 7 所以f(n)的值只可能有7种结果(0~6),另由f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7,其中A * f(n - 1) + B * f(n - 2)的结果所构成的序列的周期最多不过49,因为由排列组合的原理, f(n-1) 有7中结果,f(n-2)有 7种结果,可得共49种变化。可以把每个结果保存在数组中,直到发现数组的值又变回f(n)=1,f(n-1)=1;时,即为数组序列的周期 i=i-2。得到周期i后,最后的f(n)即等于f[n%i]。

  注意:当n%i=0时,做特殊处理,即f[0]=f[i].

View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int f[100000];
 5 int main()
 6 {
 7     int i,a,b,n;
 8     f[1]=1;
 9     f[2]=1;
10     while(cin>>a>>b>>n)
11     {
12         if(a==0&&b==0&&n==0break;
13         if(n==1||n==2)   printf("1\n");
14         else {
15             for(i=3;i<100000;i++)
16             {
17                 f[i]=(a*f[i-1]+b*f[i-2])%7;
18                 if(f[i]==1&&f[i-1]==1break;
19             }
20             i=i-2;
21             f[0]=f[i];
22             printf("%d\n",f[n%i]);
23         }
24     }
25     return 0;
26 }


 

posted @ 2012-03-28 09:10  笑巧  阅读(193)  评论(0编辑  收藏  举报