C++ 模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

任务:给定两个整数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 + 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;

cout
i
in
get\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;
}