计算和数据限制

时间:2017-06-19 11:04:21

标签: c++ g++ console-application

我有一个任务:

在单元格中的笔记本上(数学/数字的标准笔记本笔记本)绘制了大小为NxM(整数)的矩形。多少个不同的矩形可以包含这个矩形?

N和M的最大值== 10 ^ 9(1 000 000 000)

如果结果> =(10 ^ 9 + 7)显示:结果模式(10 ^ 9 + 7)

实施例: Examples

我知道公式:

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 = _ =

我做错了什么?如果有人能够展示正确解决方案的代码示例,我将非常感激。

1 个答案:

答案 0 :(得分:1)

您在long double类型中失去了精确度:您观察到的输出是2的幂的倍数这一事实是这种影响的试金石。

由于你正在使用Windows,我的资金是long double是64位IEEE754双精度浮点类型(即与该平台上的double相同),这给出了你有53位精度。

您可以切换到任意精度库,或Google&#34; Schranges算法&#34;用于计算产品模数的巧妙方法。