我有一个任务:
在单元格中的笔记本上(数学/数字的标准笔记本笔记本)绘制了大小为NxM(整数)的矩形。多少个不同的矩形可以包含这个矩形?
N和M的最大值== 10 ^ 9(1 000 000 000)
如果结果> =(10 ^ 9 + 7)显示:结果模式(10 ^ 9 + 7)
我知道公式:
M *(M + 1)* N *(N + 1)/ 4
在C ++中实现了这个问题:
#include <iostream>
#include <cmath>
#include <iomanip>
int main()
{
long double n, m;
std::cin >> n >> m;
long double n1 = (n*(n + 1) / 2);
long double m1 = (m*(m + 1) / 2);
long double count = std::fmod((n1 * m1), 1000000007);
std::cout << std::fixed << std::setprecision(0) << count;
return 0;
}
但是当我为测试写了1000000000 x 1000000000
我的程序向我显示了499881764,当Windows calclulator和other calculator显示441 = _ =
我做错了什么?如果有人能够展示正确解决方案的代码示例,我将非常感激。
答案 0 :(得分:1)
您在long double
类型中失去了精确度:您观察到的输出是2的幂的倍数这一事实是这种影响的试金石。
由于你正在使用Windows,我的资金是long double
是64位IEEE754双精度浮点类型(即与该平台上的double
相同),这给出了你有53位精度。
您可以切换到任意精度库,或Google&#34; Schranges算法&#34;用于计算产品模数的巧妙方法。