ACM 取模

Posted PapperTown

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM 取模相关的知识,希望对你有一定的参考价值。

取模公式:

          (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 取模的主要内容,如果未能解决你的问题,请参考以下文章

The 2018 ACM-ICPC China JiangSu Provincial Programming Contest快速幂取模及求逆元

费马小定理+快速幂取模ACM-ICPC 2018 焦作赛区网络预赛 G. Give Candies

HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)——2016 ACM/ICPC Asia Regional Shenyang Online

CSU-ACM集训-模板-线段树进阶

hdu2302(枚举,大数取模)

hdu1212(大数取模)