问题描述
斐波那契数列大家都非常熟悉。它的定义是:
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
首先我们设S(i)= f(1)+f(2)+...+f(i);
题干中已经告诉我们n取值很大时S(n)有可能非常大,所以不可能直接算出来
题干又进一步提示说S(n)对f(m)取模,然后进一步对p取模
我们能够直接算出的只有f(n)
所以这个题很自然的思路就是通过f(n)的表达式来表示出取模之后的结果
所以我们需要寻找S(n)和f(n)之间的关系。
事实上:s(n)=f(n+2)-1 (i>0)
我们可以通过最原始的方式,查看规律(证明可用数学归纳法,有待学习、、)
Thinking:
设f(i)为斐波那契数列第i项,s(i)=f(1)+f(2)+...+f(i),
i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
f(i) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610
s(i) 1 2 4 7 12 20 33 54 88 143 232 376 609 ... ...
得到公式之后,继续分析本题,可知
s(i)%f(m)=(f(i+2)-1)%f(m)
=f(i+2)%f(m)+f(m)-1
=(f(i)+f(i+1))%f(m)+f(m)-1;
代码待续...