蓝桥杯历届试题 斐波那契

斐波那契数列大家都非常熟悉。它的定义是:

f(x) = 1 … (x=1,2)
  f(x) = f(x-1) + f(x-2) … (x>2)

对于给定的整数 n 和 m,我们希望求出:
  f(1) + f(2) + … + f(n) 的值。但这个值可能非常大,所以我们把它对 f(m) 取模。
  公式如下

但这个数字依然很大,所以需要再对 p 求模。
输入格式
  输入为一行用空格分开的整数 n m p (0 < n, m, p < 10^18)
输出格式
  输出为1个整数,表示答案
样例输入
2 3 5
样例输出
0
样例输入
15 11 29
样例输出
25

提交成绩一直是20分,不知道哪里出错了。希望大佬可以解释下。

#include
#include
int main()
{
long long n,m,p,sum=0,i;
long long f[10^18];
scanf("%lld%lld%lld",&n,&m,&p);
f[1]=1;
f[2]=1;
if(n for(i=3;i<=m;i++)
{
f[i]=f[i-1]+f[i-2];
}
else
for(i=3;i<=n;i++)
{
f[i]=f[i-1]+f[i-2];
}
for (i=1;i<=n;i++)
{
sum=sum+f[i];
}
int t=sum%f[m];
int r=t%p;
printf("%ld",r);
return 0;
}

你可能感兴趣的:(蓝桥杯历届试题 斐波那契)