c中的int(或long long)溢出如何影响模数?

假设我有两个长long,a和b,我需要乘以,然后得到一个大k的值mod k,这样a,b和k都在long long但不是int的范围内.为简单起见,a,b< ķ. 因此代码将是:

long long a, b, k;
cin >> a >> b >> k;
cout << (a * b)%k << "\n";

但是,由于a和b如此之大,如果你像上面那样相乘,并且溢出并变为负数,则mod k将是负数并且不正确.

如何确保值mod k正确?

编辑:作为奖励,这如何在Java中工作?是否与预期一样?还是需要BigInteger?

最佳答案 许多编译器提供128位整数类型.例如,使用g,您可以创建一个函数

static inline int64_t mulmod(int64_t x, int64_t y, int64_t m)
{
    return ( (__int128_t)x * y) % m;
}

旁白:如果可以的话,在进行模运算时,尽量坚持使用无符号整数类型.整数除法的舍入行为使得在涉及有符号值时使用%非常笨拙.

点赞