【发布时间】:2017-11-11 19:57:47
【问题描述】:
我正在接受参加编程比赛的训练,所以我正在努力适应这类问题中的常见问题。我遇到了一些特别的问题:由于数字非常大而导致 int 溢出,我想知道如何解决这个特殊问题:Amelia and Rabbit Island。这是我的代码:
#include <iostream>
int main(){
unsigned long long int a,b,c;
int t;
int nweeks;
std::cin >> t;
int **lines = new int*[t];
for (size_t i = 0;i<t;i++)
lines[i] = new int[3];
for(size_t i=0;i<t;i++)
for(size_t j=0;j<3;j++)
std::cin >> lines[i][j];
for (size_t i=0;i<t;i++){
a = lines[i][1];
b = lines[i][2];
const unsigned int mod = 1000000;
for (size_t j=0;j<lines[i][0] - 2;j++){
if (j > 0){
c = a;
a = a * b % mod;
b = c;
}
else {
a = a * b;
}
}
nweeks = (lines[i][0] * 3) - 2;
std::cout << "At week " << nweeks << " we obtain " << a%mod << " new rabbits.\n";
}
for (size_t i=0;i<t;i++)
delete[] lines[i];
delete[] lines;
return 0;
}
在问题中它说答案必须用 mod(1000000) 表示,这应该避免溢出,但我就是找不到让它工作的方法,我的解决方案适用于正常值,但是比如输入的具体情况:
1 1000 10 10
这是单个案例允许的最大输入,我得到的输出是:
在第 2998 周,我们获得了 0 只新兔子。 这是错误的,都是因为 int 在乘法中溢出。
提前致谢。
编辑:嗯,由于某种原因,评估系统现在接受 mi 解决方案 -.-,无论如何谢谢。
【问题讨论】:
-
那个问题有一个不寻常的选择使用1000000。这些问题大多数都是用1000000007完成的,这是一个只需要30位的素数,它允许两个数字模1000000007相加而不会溢出32位无符号整数,乘法通常在做 mod 1000000007 之前使用 64 位无符号乘积完成。
标签: c++ modulo integer-overflow