问题描述
斐波那契数列大家都非常熟悉。它的定义是:
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
解题思路:利用a(n)=(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n},求斐波那契数列第n位的数值。for循环对前n项进行求和。最后求模。
但正确率只能达到20%,还不能理解。暂时没理解出,求解释。
#include<stdio.h>
#include<string.h>
#include<math.h>
long long def(long long m)
{
return (1/pow(5,0.5))*(pow((1+pow(5,0.5))/2,m)-pow((1-pow(5,0.5))/2,m));
}
int main()
{
long long n,m,p,num;
scanf("%lld %lld %lld",&n,&m,&p);
long long i,s=0;
i=def(m);
for(num=1;num<=n;num++)
{
s+=def(num);
}
s=s%i;
s=s%p;
printf("%lld",s);
return 0;
}