题意描述:
Fibonacci数列 的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
输入包含一个整数n,输出包含一个整数,表示fn除以10007的余数,n(1<=n<=1000000)
Fibonacci数列 的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
输入包含一个整数n,输出包含一个整数,表示fn除以10007的余数,n(1<=n<=1000000)
解题思路:
类似于把余数轮番相加当余数凑够10007的倍数则自动消去。
类似于把余数轮番相加当余数凑够10007的倍数则自动消去。
代码实现:
自己提交的内存太大,浪费时间。查找网上答案之后发现一种表达较大数的格式。
1 #include<stdio.h> 2 #define N 1000000 3 int main() 4 { 5 int f[N],n,i,t=0; 6 7 scanf("%d",&n); 8 9 f[0]=f[1]=1; 10 11 for(i=2;i<n;i++) 12 { 13 f[i]=(f[i-1]+f[i-2])%10007; 14 } 15 16 printf("%d ",f[n-1]); 17 18 return 0; 19 }
自己提交的内存太大,浪费时间。查找网上答案之后发现一种表达较大数的格式。
1 #include<stdio.h> 2 int dg(int n) 3 { 4 int s; 5 if(n==0||n==1) s=1; 6 else 7 return s=dg(n-1)+dg(n-2); 8 return s; 9 } 10 int main() 11 { 12 unsigned long s=0,a=dg(21),b=dg(22),i,n; 13 14 scanf("%d",&n); 15 16 if(n<20) printf("%d ",dg(n-1)); 17 18 else 19 { 20 for(i=23;i<n;i++) 21 { 22 s=(a+b)%10007; 23 a=b; 24 b=s;//这里将余数直接加进去减少了运算量,因为没有被算进去的一定不到10007的倍数,所以只计算余数不影响。 25 } 26 printf("%d ",s); 27 } 28 29 30 return 0; 31 }