快速乘
快(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
反复试验后发现,若是其中一个乘数原本是负数,则分两种情况:
- 若一开始对其进行取模处理到正数,则应使用模板二
- 若不对其进行处理,则应使用模板一
不知道对不对,后面请教大佬后会跟新的。