南邮 OJ 1576 斐波那契递推

斐波那契递推

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 31            测试通过 : 7 

比赛描述

著名的斐波那契问题导出的递推式为f[n] = f[n-1] + f[n-2] (n>=2)f[0] = f[1] = 1考虑这样的递推式 c[n] = 2012*c[n-1] + c[n-2]已知 n, 计算 c[n] mod 9901



输入

多组测试数据,每组测试数据占一行,一个正整数 n (n 在 int 范围内 )

输出

对每一个 n,输出 c[n] mod 9901

样例输入

1
2

样例输出

1
2013

提示

undefined

题目来源

NUPT ACM





/* Time Limit Exceed at Test 2
#include<iostream>
#define MOD 9901
int main(){
	int n,a,b,c;
	while(scanf("%d",&n)==1){
		if(n==1){
			printf("1\n");
			continue;
		}
		b = c = 1;
		n--;
		while(n--){
			a = b;
			b = c;
			c = (2012*b+a)%MOD;
		}
		printf("%d\n",c);
	}
}
*/
/* 周期19804
#include<iostream>
#include<set>
using namespace std;
#define MOD 9901

int main(){
	int n,a,b,c;
	set<int> is;
	for(int i=1;i<1000000;i++){
		n = i;
		if(n==1){
//			printf("1\n");
			is.insert(1);
			continue;
		}
		b = c = 1;
		n--;
		while(n--){
			a = b;
			b = c;
			c = (2012*b+a)%MOD;
		}
		if(c==1){
			printf("n=%d,c[n]=%d",i,c);
		}
//		printf("%d\n",c);
//		if(is.count(c)){
//			printf("n=%d,c[n]=%d has occured twice\n",i,c);
//			break;
//		}
//		is.insert(c);
	}
}
*/

#include<iostream>
#define MOD 9901
int main(){
	int n,a,b,c;
	while(scanf("%d",&n)==1){
		n %= 19804;
		if(n<=1){
			printf("1\n");
			continue;
		}
		b = c = 1;
		n--;
		while(n--){
			a = b;
			b = c;
			c = (2012*b+a)%MOD;
		}
		printf("%d\n",c);
	}
}


你可能感兴趣的:(ACM,南邮OJ,斐波那契递推)