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==0) break;
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]==1) break;
19 }
20 i=i-2;
21 f[0]=f[i];
22 printf("%d\n",f[n%i]);
23 }
24 }
25 return 0;
26 }
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==0) break;
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]==1) break;
19 }
20 i=i-2;
21 f[0]=f[i];
22 printf("%d\n",f[n%i]);
23 }
24 }
25 return 0;
26 }