每日打卡(1/1) 补
问题描述
斐波那契数列大家都非常熟悉。它的定义是:
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
这题暂时只会用暴力的做法去解,等到学会新的做法后再来更新
#include<bits/stdc++.h>
using namespace std;
const long long maxn = 1e17;
long long n,m,p;
vector<long long> f;
void solve()
{
f.push_back(0);
f.push_back(1);
f.push_back(1);
for(int i=3;i<=max(n,m);i++)
f.push_back(f[i-1]+f[i-2]);
}
int main()
{
cin>>n>>m>>p;
solve();
long long sum = 0;
for(int i=1;i<=n;i++)
{
cout<<sum<<" "<<i<<endl;
sum += f[i];
sum %= f[m];
sum %= p;
}
cout<<sum<<endl;
return 0;
}