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;

}

时间: 2024-10-10 08:20:07

ACM 取模的相关文章

HDU ACM 5214 Movie -&gt;贪心+自然溢出取模-&gt;水题里的学问

分析:贪心,首先找到最右边的第一个左边界和最左边的第一个右边界.之后在判断是否有一个及一个以上的区间在这两个值之间,若有则能找到符合题意的三个区间,否则不能. 注意:这里利用的unsigned int的自然溢出决解了取模问题:第二个是一定生成完数据后在交换Li和Ri的值,这里被坑残了. #include<iostream> using namespace std; //__int64 mod=4294967296;由于4294967296-1刚好是unsigned int类型的最大值,对它取模

ACM模板——取模

const ll mod = 1000000007; ll mult_mod(ll a,ll b) //(a*b)%mod a,b,mod<2^63 { a %= mod; b %= mod; ll ans=0; while(b) { if(b&1) { ans=ans+a; if(ans>=mod) ans=ans-mod; } a=a<<1; if(a>=mod) a=a-mod; b=b>>1; } return ans; } 积取模 const l

CodeForces 450B (矩阵快速幂模板题+负数取模)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51919 题目大意:斐波那契数列推导.给定前f1,f2,推出指定第N项.注意负数取模的方式:-1%(10^9+7)=10^9+6. 解题思路: 首先解出快速幂矩阵.以f3为例. [f2]  * [1 -1] = [f2-f1]=[f3]  (幂1次) [f1]  * [1  0]     [f2]      [f2] 于是fn=[f2] *[1 -1]^(n-2)

位运算之——按位与(&amp;)操作——(快速取模算法)

由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快. 按位与(Bitwise AND),运算符号为& a&b 的操作的结果:a.b中对应位同时为1,则对应结果位也为1. 例如: 10010001101000101011001111000 & 111111100000000 --------------------------------------------- 10101100000000 对10101100000000进行右移8位得到的是101011,这就得

hdu 3221 Brute-force Algorithm(快速幂取模,矩阵快速幂求fib)

http://acm.hdu.edu.cn/showproblem.php?pid=3221 一晚上搞出来这么一道题..Mark. 给出这么一个程序,问funny函数调用了多少次. 我们定义数组为所求:f[1] = a,f[2] = b, f[3] = f[2]*f[3]......f[n] = f[n-1]*f[n-2].对应的值表示也可为a^1*b^0%p,a^0*b^1%p,a^1*b^1%p,.....a^fib[n-3]*b^fib[n-2]%p.即a,b的指数从n=3以后与fib数列

hoj3152-Dice 等比数列求和取模

http://acm.hit.edu.cn/hoj/problem/view?id=3152 Dice My Tags (Edit) Source : Time limit : 1 sec Memory limit : 128 M Submitted : 82, Accepted : 18 You have a dice with M faces, each face contains a distinct number. Your task is to calculate the expect

杭电 4506 小明系列故事——师兄帮帮忙【快速幂取模】

题目:小明自从告别了ACM/ICPC之后,就开始潜心研究数学问题了,一则可以为接下来的考研做准备,再者可以借此机会帮助一些同学,尤其是漂亮的师妹.这不,班里唯一的女生又拿一道数学题来请教小明,小明当然很高兴的就接受了.不过等他仔细读题以后,发现自己也不会做,这下小明囧了:如果回复说自己不懂,岂不是很没面子? 所以,他现在私下求你帮忙解决这道题目,题目是这样的: 给你n个数字,分别是a1,a2,a3,a4,a5……an,这些数字每过一个单位时间就会改变,假设上一个单位时间的数字为a1’,a2’,a

HDU5894 hannnnah_j’s Biological Test 组合数取模

http://acm.hdu.edu.cn/showproblem.php?pid=5894 题意:给你n个桌子,m个人,相邻两个人之间相差至少K个桌子.问有多少种坐法. 题解:首先确定第一个人的座位,从n个座位中选择一个,然后确定出符合条件的k*m个座位.最后剩下n-1-k*m个座位,从中选出m-1个座位坐人.总数sum=n*C(n-1-k*m,m-1); 由于有m个重合,因此要sum=sum/m;例如:(2,4,7),(4,7,2),(7,2,4)是一样的. 计算组合数和sum/m时可以使用

HDU 5363 Key Set【快速幂取模】

Key Set Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1886    Accepted Submission(s): 990 Problem Description soda has a set S with n integers {1,2,-,n}. A set is called key set if the sum