鑫鑫的学习博客

导航

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了

 

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

posted on 2014-08-13 17:10  鑫鑫的学习博客  阅读(589)  评论(2编辑  收藏  举报