问题描述
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<stdio.h>
typedef unsigned long long ULL;
ULL a[1000000+1];
void setfn()
{
a[1]=1;
a[2]=1;
int i = 3;
for(i=3; i<1000000+1; i++)
{
a[i] = a[i-1]+a[i-2];
}
}
int main()
{
int n;
setfn();
scanf("%d", &n);
printf("%d\n", a[n]%10007);
return 0;
}
恩,,,这个是我刚开始的想法,,,结果只得了40分,,后来发现这个数到最后会很大ULL都包含不了,,,所以 放弃了
#include <stdio.h>
int main(void)
{
int a, b;
long n;
int t[1000000];
int i;
t[1] = 1;
t[2] = 1;
while(scanf("%ld",&n) != EOF&&n) {
for(i=3; i<1000000; i++) {
t[i] = (t[i-1] + t[i-2]) % 10007;
if(t[i] == 1 && t[i-1] == 1)
break;
}
t[0] = t[i - 2];
n %= (i-2);
printf("%d\n", t[n]);
}
return 0;
}
这是我第二次想到的解法,是根据HDU1005的题解想出来的,多刷题还是有好处的,然后还有第三种方法,就是每算一次都模除,恩,,就不写了。