斐波那契的余数
分析这个题目:P的取值是(1,500),所以f(4999)很大很大了,根本就long long型都无法表示,不过,K的取值为[ 1,15),最大2^14=16384, 这个还好处理。然后结合本题斐波那契的余数,首先,斐波那契应该采取怎样的算法求解,目前,我知道的两种,一种是我将要采用的递推法,还有一种是递归法。(注意,尽管这两个方法一字之差,可是完全不一样的),至于我为什么选择递推法,请看https://blog.****.net/qq_41045071/article/details/82872129,这个有两者的比较。斐波那契求法选好后,下面就该考虑这么大数和怎么求余了,我采用的是递推过程中就一步一步取余,这样这个数就不会超过16384。下面附上代码:
#include<stdio.h>
int f1(int n,int s) //用于计算斐波那契数列,这个用到递推法
{
int fa,fb,f;
fa=0%s,fb=1%s;
if(n==2) return 1;
for(int i=2;i<n;i++)
{
f=(fa+fb)%s;
fa=fb%s;
fb=f%s;
}
return f;
}
int g(int k) //这个用于计算2的k次方
{
int s=1;
for(int i=1;i<=k;i++)
s*=2;
return s;
}
int main()
{
int P,K; //题目输入值,0<P<5000,1<=K<15
int result;
while(scanf("%d%d",&P,&K)!=EOF) //多组数据输入
{
if(P==0&&K==0) return 0; //多组输入结束条件
else
{
result=f1(P,g(K));
printf("%d\n",result);
}
}
return 0;
}