乘法运算时溢出
Overflow while doing multiplication
我想计算(N*N*(N+1)/2)mod M的值,其中N可以达到10^18,M最大值达到10^7。我试着对它进行编码,但不知道它溢出的原因。这是我的代码:
我主要做这样的事情:
long long tt=mulmod(N,N+1,MOD)*InverseEuler(2,MOD);
long long mm=mulmod(tt,N,MOD);
和mulmod函数find(A*B)%C。如下所示:
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;
}
逆欧拉也是这样的:
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);
}
请帮助我查找此代码中的错误。
问题是,如果提供了正确(或错误)的操作数集,则每个操作都会溢出。
另一个代码在评论中暗示,模10^7不会溢出长的(事实上它不会溢出长)
你需要利用的身份
(a+b)%c == ((a%c) + (b%c))%c
(a*b)%c == ((a%c)*(b%c))%c
这些恒等式的数学证明是微不足道的。
如果值a和b接近long-long所能表示的极限,则将它们相加或相乘可能会溢出。然而,这些恒等式右边的表达式使用模运算符来避免可能溢出的加法或乘法运算。
也不需要使用循环。
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- GCC本机矩阵运算库
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- C++中无符号字符溢出
- 位阵列上的快速AND运算
- 字符串中int的加法运算
- 算术运算的结果类似于:C浮点变量中的1/3
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 如何正确避免 SIGFPE 和算术运算溢出
- 乘法运算时溢出
- 检查算术运算中是否存在溢出情况
- 为什么在这个乘法运算中会出现整数溢出
- 当算术运算溢出时,它们会产生一个确定性的数字
- 在乘法运算中测试有符号整数溢出的方法
- 在对基本类型进行数学运算时检查溢出/下溢