使用Modulo操作的正确方法
Proper way of using Modulo operation
在一个编程比赛中,我被要求带有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位未签名的整数(ull
或uint64_t
(,因为它在某些系统上可能会更快。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 使用Modulo操作的正确方法