ACM 取模
阿新 • • 發佈:2017-07-31
防止 .com 大整數取模 for man 分治算法 dex cin ima
取模公式:
(a+b) mod n=((a mod n)+(b mod n))%n
(a-b) mod n=(a mod n -b mod n +n)mod n
a*b mod n =(a mod n)*(b mod n)mod n
1大整數取模:輸入n,m求n%m,其中n<=10^1000000,m<=10^9
?1 2 3 4 5 6 7 8 |
//大整數取模
int big_number_mod( char *str, int m){
int len = strlen (str), res = 0;
for ( int i = 0; i < len; i++){
res = (res * 10 + str[i] - ‘0‘ ) % m;
}
return res;
}
|
2.冪取模 an mod m的值,a,n,m<=10^9。采用分治算法可以在O(longn)算出來,例如a29=(a14)2a,而a14=(a7)2,a7=(a3)2a,a3=a2a。
?1 2 3 4 5 6 7 8 |
//冪取模:計算a^n mod m
//O(longn)
int pow_mod( int a, int n, int m){
if (n == 0) return 1;
int x = pow_mod(a, n / 2, m);
LL ans = (LL)x*x %m;
if (n & 1)ans = ans*a%m;
return ( int )ans;
|
3.快速冪取模運算:計算an mod m 。采用快速冪將n分解為二進制。例如n=11,則10=10112,於是a11=a1+2+8,可以依次計算a,a2,a4,a8,然後計算出a11
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//快速冪取模:計算a^n mod m
//O(longn) int quick_pow_mod( int a, int n, int m){
if (n == 0) return 1;
int res = 1;
while (n > 0){
if (n & 1)
res=res*a%m;
a = (a%m)*(a%m)%m; //防止溢出
n >>= 1;
}
return res;
}
|
ACM 取模