蓝桥杯: 斐波那契
来源:互联网 发布:网络维护外包收费标准 编辑:程序博客网 时间: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 求模。
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
- 蓝桥杯: 斐波那契
- 蓝桥杯-斐波那契
- 斐波那契
- 斐波那契
- 斐波那契
- 斐波那契
- 斐波那契
- 斐波那契
- 斐波那契
- 斐波那契
- 【斐波那契】
- 斐波那契
- 斐波那契
- 斐波那契
- 斐波那契
- 斐波那契
- 斐波那契
- 斐波那契
- Sicily 13858. Goldilocks and the N Cows
- Python-字典使用
- 【手写排序算法及优化】冒泡排序
- linux设备驱动第三篇:写一个简单的字符设备驱动
- MYSQL char 和varchar的区别
- 蓝桥杯: 斐波那契
- Java多态实现机制
- 猫猫学IOS(十二)UI之UITableView学习(上)LOL英雄联盟练习
- 各大浏览器内核(Rendering Engine)
- system for signal
- 【C语言】从标准输入读取几行输入,每行输入都要打印到标准输出上,前面加上行号,并使此程序能够处理的输入行的长度没有限制。
- 文法俱乐部 第一章 基本句型及补语
- 跨行動裝置 App 開發: 使用 Visual Studio 2013 + Apache Cordova (PhoneGap)
- 安卓逆向学习(二 DEX文件说明)