蓝桥杯试题集 入门训练(C++)

问题描述
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

输入格式
输入包含一个整数n。

输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。

说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。

样例输入
10

样例输出
55

样例输入
22

样例输出
7704

数据规模与约定
1 <= n <= 1,000,000。

#include 
using namespace std;
const int N = 10007;
int main(){
	int n,k = 1;
	scanf("%d",&n);
	if(n>2){
	int i = 1, j = 1;
		for(int count = 2;count!=n;++count){
			k = (i+j)%N;
			i = j;
			j = k;
		}
	}
	printf("%d",k);
}

解析 k = (i+j)%N; \\ 其中 N为10007


斐波那契数列中,F(21) = 10946 ; F(22) = 17711 ; F(23) = 46368 ;
上面的三个数分别对 10007 取余,得到的结果分别是 939、7704、8463;

当 count = 20 时, i = F(20)%N = 6765,j = F(21)%N = 939;k = (i+j)%N = (6765+939)%N = 7704 = [ F(20)+F(21) ] % N = (6765+10946);
当count = 21 时,i = F(21)%N = 939 ; j = F(22)%N = 7704 ; k = (i+j)%N = (939+7704)%N = 8463 = [ F(21)+F(22) ] %N;


你可能感兴趣的:(蓝桥杯试题集 入门训练(C++))