HDOJ1005 数列

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
 
我一开始写的程序如下,它的运算结果是对的,但是提交以后系统评判我运算超时了,后来一想确实是如此的。
 1 #include<iostream>

 2 #include<cmath>

 3 using namespace std;

 4 

 5 int myfunction( int A, int B, int n )

 6 {

 7     int counts = n-3+1;

 8     int first=1,second=1,result;

 9     for( int i=0; i<counts; i++ )

10     {

11         result = (B*first+A*second)%7;   //大部分的时间都浪费在了这里

12         first = second;

13         second = result;

14     }

15     return result;

16 }

17 

18 int main(void)

19 {

20     int A,B,n;

21 

22     while(1)

23     {

24         cin>>A>>B>>n;

25         if( A==0 && B==0 && n==0 )

26             break;

27         if( n==1 || n==2 )

28             cout<<1<<endl;

29         else

30         {

31             cout<<myfunction(A,B,n)<<endl;

32         }

33     }

34     return 0;

35 }

其实这个数列是有规律的,只要算出它的一圈数列后,再算出n中有多少圈,之后就知道最终得出圈中哪个数。

例如输入1 2 10000后,数列的前几个数为1  1  3  5  4  0  1  1

它开始转圈了,因此我将程序改成如下所示:

 1 #include<iostream>

 2 using namespace std;

 3 int main()

 4 {

 5     int a,b,n,i,m,t[100];

 6     t[1]=1;

 7     t[2]=1;

 8     while(cin>>a>>b>>n)

 9     {

10         if((a==0)&&(b==0)&&(n==0))

11             break;

12         a=a%7;

13         b=b%7;

14         for(i=3; i<100; i++)

15         {

16             t[i]=(a*t[i-1]+b*t[i-2])%7;

17             if((t[i]==1)&&(t[i-1]==1))

18             {

19                 break;

20             }

21         }

22         m=n%(i-2);

23         if(m==0)

24             cout<<t[i-2]<<endl;

25         else

26             cout<<t[m]<<endl;

27     }

28     return 0;

29 }

哈哈,AC了

 

这道题给我的提示是,遇到数列题目时要想想里面是不是存在“转圈”现象,发觉里面的规律,之后编程就容易了。

你可能感兴趣的:(OJ)