蓝桥杯: 斐波那契

来源:互联网 发布:网络维护外包收费标准 编辑:程序博客网 时间:2024/05/17 04:01
问题描述
  斐波那契数列大家都非常熟悉。它的定义是:

  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



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(i+2)-1 (i>0)
又:
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;
得到公式之后就好办多了,但是有一个问题,n,m,p的范围较大,必须用大整数运算才能得满分,我在这里没用大整数,所以,只能过40%的数据,改天再改改~
#include<iostream>using namespace std;int main(){long long i,j,n,m,p,a,b,c,fm,sn,result;cin>>n>>m>>p;a=b=1;for(i=3;i<=m;i++)//求fm{c=a+b;a=b;b=c;}fm=b;a=b=1;for(i=3;i<=n+2;i++)//求sn{if(a+b>=fm)c=(a+b)%fm;elsec=a+b;a=b;b=c;}sn=(b+fm-1)%fm;result=sn%p;cout<<result<<endl;return 0;}












0 0
原创粉丝点击