使用Modulo操作的正确方法

Proper way of using Modulo operation

本文关键字:方法 Modulo 操作 使用      更新时间:2023-10-16

在一个编程比赛中,我被要求带有1000000007的Modulo。

以下是显示我如何实现它的代码。

#include <stdio.h>
#define ll long long
#define MOD 1000000007
ll getmin(ll a, ll b){return (a<b)?a:b;}
void solve(){
    ll a,b,c,Tv;
    scanf("%lld %lld %lld",&a,&b,&c);
    Tv = ((a%MOD)*(b%MOD)*(c%MOD))%MOD;
    ll sideofcube = getmin(a,getmin(b,c));
    ll numofcube = 0;
    ll smallvol = ((sideofcube%MOD)*(sideofcube%MOD)*(sideofcube%MOD))%MOD;
    numofcube = Tv/smallvol;
    printf("%lld %lldn",sideofcube,numofcube);
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        solve();
    }
    return 0;
}

使用输入

1
1000000000 1000000000 100000000

我得到负面响应,如

100000000 -1

这里出了什么问题?我甚至在繁殖之前都采用mod。

((a%MOD)*(b%MOD)*(c%MOD))的乘积可以溢出一个64位整数。为了避免此问题,一次仅乘以两个术语:

    Tv = ((a % MOD) * (b % MOD)) % MOD;
    Tv = ((Tv) * (c % MOD)) % MOD;

还应将typedef用于 ll

typedef long long ll;

在这种情况下,两个术语的乘积仅需要60位(log2(1000000007*1000000007)(,因此产品不会溢出并变为负面。您可能需要使用64位未签名的整数(ulluint64_t(,因为它在某些系统上可能会更快。