斐波那契
问题描述
斐波那契数列大家都非常熟悉。它的定义是:
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 求模。输入格式15
输入为一行用空格分开的整数 n m p (0 < n, m, p < 10^18)
输出格式
输出为1个整数,表示答案
样例输入
2 3 5
样例输出
0
样例输入
15 11 29
样例输出
25
题目解析
比赛中,斐波那契数列这种不要用递归
//斐波那契
f(x) = 1 (x=1,2)
f(x) = f(x-1) + f(x-2) (x>2)
f(x) = f(x-1) + f(x-2)
f(x+1) = f(x) + f(x-1)
f(x) - f(x+1) = f(x-2) - f(x)
f(x) = f(x+1) + f(x-2) - [f(x-1) + f(x-2)]
f(x) = f(x+1) - f(x-1)
即:
f(x) = f(x+1) - f(x-1)
得出:
Σf(n) = f(n) + f(n+1) - f(1) = f(n+2) - f(1)
即:
Σf(n) = f(n+2) - f(1)
方法一 40分
#include <iostream>
using namespace std;
unsigned long long n, m, mod;
/*
//斐波那契
f(x) = 1 (x=1,2)
f(x) = f(x-1) + f(x-2) (x>2)
f(x) = f(x-1) + f(x-2)
f(x+1) = f(x) + f(x-1)
f(x) - f(x+1) = f(x-2) - f(x)
f(x) = f(x+1) + f(x-2) - [f(x-1) + f(x-2)]
f(x) = f(x+1) - f(x-1)
即:
f(x) = f(x+1) - f(x-1)
得出:
Σf(n) = f(n) + f(n+1) - f(1) = f(n+2) - f(1)
即:
Σf(n) = f(n+2) - f(1)
*/
void solve() {
unsigned long long a = 1, b = 1;
if(m >= n+2){
for(int i = 3; i <= n+2; i++){
unsigned long long t = a;
a = b;
b += t;
}
cout << b % mod -1;
}else{
unsigned long long fibM, fibN2 = 0;
for(int i = 3; i <= n+2; i++){
unsigned long long t = a;
a = b;
b += t;
if(i == m){
fibM = b;
}
}
fibN2 = b;
cout << fibN2 % fibM % mod -1;
}
}
int main(int argc, char** argv) {
cin >> n >> m >> mod;
solve();
return 0;
}