C++ 模m的斐波那契数
任务:给定两个整数n和m,输出Fn mod m(它们是Fn除以m的余数) 我的代码:C++ 模m的斐波那契数,c++,C++,任务:给定两个整数n和m,输出Fn mod m(它们是Fn除以m的余数) 我的代码: #include <iostream> #include <vector> using namespace std; long long get_pisano_period(long long m) { long long a = 0, b = 1, c; for (int i = 0; i < m * m; i++) { c = (a
#include <iostream>
#include <vector>
using namespace std;
long long get_pisano_period(long long m)
{
long long a = 0, b = 1, c;
for (int i = 0; i < m * m; i++)
{
c = (a + b) % m;
a = b;
b = c;
if (a == 0 && b == 1)
return i + 1;
}
}
long long calc_fib(long long n)
{
vector<long long> nums(n + 1);
nums.at(0) = 0;
nums.at(1) = 1;
for (long long i = 2; i < nums.size(); i++)
{
nums.at(i) = nums.at(i - 1) + nums.at(i - 2);
}
return nums.at(n);
}
long long solve(long long n, long long m)
{
long long r = n % get_pisano_period(m);
return (calc_fib(r) % m);
}
int main()
{
long long n, m;
cin >> n >> m;
cout << solve(n, m) << endl;
return 0;
}
您可以看到我应该得到161作为输出。我尝试了@idclev463035818所说的,这似乎有效。 试试看
#包括
#包括
使用名称空间std;
长周期(长m)
{
长a=0,b=1,c;
for(长i=0;i>n>>m;
couti
inget\u pisano\u period
应该是一个long
@1201程序尝试了,但没有成功。使用更大的类型只会转移问题。先做数学。模是分布的,即(a+b)mod n=[(a mod n)+(b mod n)]mod n
。您永远不需要在存储区中存储大于2*m的数字code@idclev463035818你是不是建议我在函数get\u pisano\u周期中使i<2*n?
Input:
239
1000
Output:
-191
# include <iostream>
# include <vector>
using namespace std;
long long get_pisano_period(long long m)
{
long long a = 0, b = 1, c;
for (long long i = 0; i < m * m; i++)
{
c = (a + b) % m;
a = b;
b = c;
if (a == 0 && b == 1)
return i + 1;
}
}
long long calc_fib(long long n, long long m)
{
vector<long long> nums(n + 1);
nums.at(0) = 0;
nums.at(1) = 1;
long long maximum = get_pisano_period(m);
for (long long i = 2; i < nums.size(); i++)
{
nums.at(i) = (nums.at(i - 1)%m + nums.at(i - 2)%m)%m;
}
return nums.at(n);
}
int main()
{
long long n, m;
cin >> n >> m;
cout << calc_fib(n, m) << endl;
return 0;
}