算法竞赛中,我们经常需要使用到取模运算。下面总结一些取模操作,以备将来形成自己的算法支持包。
typedef long long LL;
加法取模
目标
实现 a+b 对 m 取模。
函数原型
LL modsum(LL a, LL b, LL m);
实现
LL modsum(LL a, LL b, LL m) {
return ((a%m)+(b%m))%m;
}
减法取模
目标
实现 a-b 对 m 取模。
函数原型
LL modsub(LL a, LL b, LL m);
实现
LL modsub(LL a, LL b, LL m) {
return ((a%m)-(b%m))%m;
}
乘法法取模
目标
实现 a*b 对 m 取模。
函数原型
LL modmul(LL a, LL b, LL m);
实现
LL modmul(LL a, LL b, LL m) {
return ((a%m)*(b%m))%m;
}
连续乘法取模
目标
实现 对 m 取模。
函数原型
LL modfact(LL a, LL b, LL m);
实现
LL modfact(LL a, LL b, LL m) {
if (a<b) {
return 0;
}
ll ans=1;
while (a>=b) {
ans = ((ans%m)*(a%m))%m;
a--;
}
return ans;
}
幂函数取模
目标
实现 对 m 取模。
函数原型
LL modpow(LL a, LL b, LL m);
实现
LL modpow(LL a, LL b, LL m) {
if (0==b) {
return 1;
}
if (0==b%2) {
ll ans=modpow(a, b/2, m);
return ((ans%m)*(ans%m))%m;
}
return ((a%m)*(modpow(a, n-1, m)%m))%m;
}