【模板】快速乘
快速乘
快(gui)速乘,就是在两个数乘爆long long但是结果对long long范围内的数取模的情况下可以避免麻烦的高精度的技巧。
背过就好。
板子
下面的板子是接近O(1)的,利用了溢出与long double。
inline long long ksc(long long x,long long y,long long mod)
{
return (x*y-(long long)((long double)x/mod*y)*mod+mod)%mod;
}
下面的板子是O(log)的,利用了快速幂思想。
long long ksc(long long n, long long k, long long mod){
long long ans = 0;
while(k){
if(k & 1) ans = (ans + n) % mod;
k >>= 1;
n = (n + n) % mod;
}
return ans;
}
update 2021/6/11
反复试验后发现,若是其中一个乘数原本是负数,则分两种情况:
- 若一开始对其进行取模处理到正数,则应使用模板二
- 若不对其进行处理,则应使用模板一
不知道对不对,后面请教大佬后会更新的。
update 2021/10/03
请教了老师,又进行了实验。
得出以下结论:
- 第一个板子无论什么情况都可以,也不用考虑先取模后取模的问题。
- 第二个板子若是负数且不处理会出错,因为其并没有考虑负数情况,每次ans+=k,而k为负数时应改为ans-=k。