【发布时间】:2016-05-03 16:41:25
【问题描述】:
问题陈述:给定两个整数n和m,输出Fn mod m(即Fn除以m的余数)。
输入格式。输入由在同一行上给出的两个整数 n 和 m 组成(用空格分隔)。 约束。 1 ≤ n ≤ 10^18, 2 ≤ m ≤ 10^5
输出格式。输出 Fn mod m。
我尝试了以下程序,但没有成功。根据http://webspace.ship.edu/msrenault/fibonacci/fiblist.htm,方法 pi 返回正确的 Pisano 句点,但对于任何数字
#include <iostream>
long long pi(long long m) {
long long result = 2;
for (long long fn2 = 1, fn1 = 2 % m, fn = 3 % m;
fn1 != 1 || fn != 1;
fn2 = fn1, fn1 = fn, fn = (fn1 + fn2) % m
) {
result++;
}
return result;
}
long long get_fibonaccihuge(long long n, long long m) {
long long periodlength = pi(m);
int patternRemainder = n % periodlength;
long long *sum = new long long[patternRemainder];
sum[0] = 0;
sum[1] = 1;
for (int i = 2; i <= patternRemainder; ++i)
{
sum[i] = sum[i - 1] + sum[i - 2];
}
return sum[patternRemainder] % m;
}
int main() {
long long n, m;
std::cin >> n >> m;
std::cout << get_fibonaccihuge(n, m) << '\n';
}
确切的程序/逻辑在 python 中运行良好,正如预期的那样。这个 cpp 程序有什么问题?是数据类型吗?
【问题讨论】:
-
是 10^18 还是 1018 ?在约束中?
-
我尝试了以下程序,但它不起作用不是一个很好的描述。您需要告诉我们输入、输出和预期输出。还必须单步执行代码,看看哪里出了问题?
-
在每一步之后计算余数,否则中间会溢出。
-
当您使用它时,Fn 应该始终为正,所以我认为没有任何理由使用 signed
long long值。 -
@sasha mathoverflow.net/questions/40816/fibonacci-series-mod-a-number 与 OP 的问题更相关。