首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在进行乘法时溢出

在进行乘法时溢出
EN

Stack Overflow用户
提问于 2015-02-07 03:57:51
回答 1查看 487关注 0票数 0

我想计算(N* N *(N+1)/2) mod M的值,其中这个N最多可以达到10^18,而M的最大值是10^7。我试着对它进行编码,但不知道其溢出的原因。这是我的代码:

总的来说,我会做这样的事情:

代码语言:javascript
复制
long long tt=mulmod(N,N+1,MOD)*InverseEuler(2,MOD);
long long mm=mulmod(tt,N,MOD);

多函数求(A*B)%C。其内容如下:

代码语言:javascript
复制
long long mulmod(long long a,long long b,long long c)
{    
    long long x = 0,y = a%c;
    while(b > 0)
    {
        if(b%2 == 1)
        {
            x = (x+y)%c;
        }
        y = (y*2)%c;
        b /= 2;
    }
    return x%c;
}

反欧拉也是这样的:

代码语言:javascript
复制
long long p(long long n,int m,long long int MOD)
{
    if(m == 0) return 1%MOD;

    long long x = p(n,m/2,MOD);
    if(m%2 == 0)
        return (x*x)%MOD;
    else
        return (((x*x)%MOD)*n)%MOD;
}
long long InverseEuler(int n,int MOD)
{
    return p(n,MOD-2,MOD);
}

请帮助我查找这段代码中的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-07 10:46:27

问题是,如果提供正确(或错误)操作数集,则每个操作都会溢出。

刚才的代码在注释中暗示,模10^7不会溢出一个长(实际上不会溢出一个长)

你需要利用这些身份

  • (a+b)%c == ((a%c) + (b%c))%c
  • (a*b)%c == ((a%c)*(b%c))%c

这些恒等式的数学证明是微不足道的。

如果a和b的值接近long long所能表示的值的极限,那么添加或乘以它们就会溢出。但是,这些标识右侧的表达式使用模运算符来避免可能溢出的加法或乘法。

也不需要使用循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28378372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档