2017-06-19 54 views
0

我有一个任务:计算和数据限制

在笔记本电池(非标准grided笔记本数学/数字),大小为N×M(intergers)画矩形。多少个不同的矩形可以包含这个矩形?

为N和M == 10^9(1 000 000 000)

最大值

如果结果> =(10^9 + 7)示出了:结果MOD(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; 
} 

但是,当我写了测试十亿X 10亿

我的程序显示我499881764,当Windows calclulator和other calculator显示441 = _ =

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

回答

0

您在long double类型中失去了精度:您观察到的输出是2的幂的倍数的事实是此效应的试金石。

由于您使用的是Windows,因此我的钱是long double是一个64位IEEE754双精度浮点型(即与该平台上的double相同),并且可以提供53位精度。

您可以切换到任意精度库或谷歌“Schranges算法”,以便为产品计算模数的巧妙方式。

+0

您可以显示正确解决方案的代码示例吗? – NemoUA

+0

你可以用它显示这个算法和例子吗,我很喜欢用C++中的数字。 – NemoUA