取模问题
一、取模运算
二、复数取模
一、取模运算
1.取模加减乘除法
(a + b)%M = (a%M + b%M)%M除法的取模参考这篇博客:https://blog.csdn.net/qq_53269459/article/details/120464725
(a - b)%M = (a%M - b%M + M )%M (a%M - B%M 后的值一定小于M)
(a * b)%M = (a%M)*(b%M)%M
当然这里还没有除法的取模
还有指数的取模:a^b%p = (a%p)^(φ( p ) + b%φ( p )) %p(降幂公式)
指数取模参考:欧拉定理延伸
下面两种方法都用到了取模加减乘乘除运算,才能有下面两种方法的快速运算
2.快速幂
264 >= unsigned long long
typedef long long ll;
ksm(ll a,ll p)
{
ll res = 1;
while(p){
if(p&1) res = res*a%M;
a = a*a%M;
p >>= 1;
}
return res;
}
3.快速乘
109 * 109 >= 1018 在这种情况下需要使用快速乘的方法
typedef long long ll;
ksc(ll a,ll b)
{
ll res = 0;
while(b){
if(b&1) res = (res+a)%M;
a = 2*a%M;
b >>= 1;
}
return res;
}
二、负数取模
9%10 = 1[杭电7004](https://acm.hdu.edu.cn/showproblem.php?pid=7004)
(两个整数的取模)
-9%10 = 1 ⇐ ⇒ (-9 + 10)%10
11%(-10) = -9 ⇐ ⇒ (11 - 20)%(-10)
9%(-10) = -1 ⇐ ⇒ (9 - 10)%(-10)
11%(-10) = -9 ⇐ ⇒ (11 - 20)%(-10)
(一正一负的取模)
(-9)%(-10) = -9 ⇐ ⇒ 9%10
(-11)%(-10) = -1 ⇐ ⇒ 11%10
(两个数都为负数的取模)