Number Sequence
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005
题目要求
给一个数列满足 f ( n ) = ( a * f (n - 1 ) + b * f ( n - 2 ) ) mod 7 ,且f (1 ) = 1 , f ( 2 ) = 1, 给定a,b,n,输出f(n)。
分析
首先分析可知a和b都是已知量,故每一个f(n)都是由f( n-1 )和 f( n-2 )唯一确定的值,所以f ( 3 ) 是由 f (1)和f ( 2 )确定的,当某一次f( n-1 )==1 和 f( n-2 )==1均成立时,就成为了一个循环,时间复杂度大大降低。
第二个问题就是确定循环,因为是mod 7的公式,故f( n-1 ) 和f( n-2 )只能取 0,1,2,3,4,5,6七个值,一共就是49种情况。只需要最多列举49次即可得到结果。
不用担心重复的情况出现,举个栗子。
- 1 1
- 1 2
- 2 3
- 3 4
- 4 5
- 5 2
- 2 3
…
如上假设,第七次出现了重复,而会再一次出现2一定是1 1 这一对数值决定的,不可能是4 5。
代码
#include<iostream>
using namespace std;
int main(){
int a,b,n,z,i;
int s[55];
while(~scanf("%d%d%d",&a,&b,&n)&&(a||b||n)){
s[1]=s[2]=1;
for(i=3;i<50;i++){
s[i]=(s[i-1]*a+s[i-2]*b)%7;
if(s[i]==1&&s[i-1]==1)
break;
}
z=i-2;
if(n%z==0)
cout<<s[z]<<endl;
else
cout<<s[n%z]<<endl;
}
return 0;
}