快速幂取模(POJ 1995)

http://poj.org/problem?id=1995

以这道题来分析一下快速幂取模

a^b%c(这就是著名的RSA公钥的加密方法),当a,b很大时,直接求解这个问题不太可能

利用公式a*b%c=((a%c)*b)%c

每一步都进行这种处理,这就解决了a^b可能太大存不下的问题,但这个算法的时间复杂度依然没有得到优化

由此可以用快速幂算法优化:

http://www.cnblogs.com/qlky/p/5020402.html

再结合取模公式:

(a + b) % p = (a % p + b % p) % p

http://www.cnblogs.com/qlky/p/5020632.html

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <cmath>
 5 #include <algorithm>
 6
 7 using namespace std;
 8
 9 long long mod(long long a,long long b,long long m)
10 {
11           long long r =1,base = a;
12           while(b!=0)
13           {
14                     if(b&1)
15                               r= r*base%m;
16                     base= base*base%m;
17                     b>>=1;
18           }
19           return r;
20 }
21
22 int main()
23 {
24     long long t,n,m,i;
25     long long sum = 0;
26     scanf("%lld",&t);
27     while (t--)
28     {
29         scanf("%lld%lld",&m,&n);
30
31         long long a,b;
32                     scanf("%lld%lld",&a,&b);
33                     sum = mod(a,b,m);
34
35         for(i = 0;i<n-1;i++)
36         {
37                   scanf("%lld%lld",&a,&b);
38                   sum+=mod(a,b,m);
39                   sum%=m;
40                     }
41                     printf("%lld\n",sum);
42
43     }
44     return 0;
45 }
时间: 2024-08-02 02:43:58

快速幂取模(POJ 1995)的相关文章

快速幂取模 POJ 3761 bubble sort

题目传送门 1 /* 2 题意:求冒泡排序扫描k次能排好序的全排列个数 3 数学:这里有一个反序列表的概念,bj表示在j左边,但大于j的个数.不多说了,我也是看网上的解题报告. 4 详细解释:http://blog.csdn.net/cscj2010/article/details/7820906 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstring> 9 #include <cma

POJ 1845 - Sumdiv ( 数论 + 唯一分解定理 + 快速幂取模 )

POJ 1845 - Sumdiv ( 数论 + 唯一分解定理 + 快速幂取模 ) 这是一道数论的好题,需要较好的数学基础 题意: 给定A,B,求A^B的所有因数的和,再MOD 9901 分析: 这里用到了数论当中相当一部分知识 a. 唯一分解定理 任何一个整数都可以分解为若干个素数的幂的乘积的形式 A = ( p1 ^ q1 + p2 ^ q2 + ..... + pn ^ qn ) p为素数 A^B = ( p1 ^ (q1*B) + p2 ^ (q2*B) + ..... + pn ^ (

POJ 3233-Matrix Power Series( S = A + A^2 + A^3 + … + A^k 矩阵快速幂取模)

Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 20309   Accepted: 8524 Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + - + Ak. Input The input contains exactly one test cas

快速幂及快速幂取模

快速幂顾名思义,就是快速算某个数的多少次幂.其时间复杂度为 O(log?N), 与朴素的O(N)相比效率有了极大的提高.——bybaidu 快速幂可以用位运算这个强大的工具实现. 代码: 1 int pow(int a,int b) 2 { 3 int ans=1; 4 while(b!=0) 5 { 6 if(b&1) 7 ans*=a; 8 a*=a; 9 b>>=1; 10 } 11 return ans; 12 } 快速幂取模需要记住一个定理:积的取模等于取模积的取模:算法是蒙

关于快速幂取模

今天看算法书的时候,看到一道关于快速幂取模的题,心想好像不难,便写了一下,发现我的渣渣代码写的比正常的O(N)复杂度还要慢(天知道我怎么做到的T_T),渣渣代码如下: 1 public static long fastMi(long x,long n){ 2 if(n==1){ 3 return x; 4 } 5 if(n%2==0){ 6 return fastMi(x,n/2)*fastMi(x,n/2); 7 }else{ 8 return fastMi(x,n/2)*fastMi(x,n

快速幂取模算法

什么是快速幂? 快速幂应当是快速幂取模的简称 对于一般的求幂算法,求$a^b\,\bmod\,m$,即使用循环b次的方法,复杂度是$O(b)$的,当b很大的时候,这种算法就会显得十分缓慢. 快速幂是基于以下明显的事实: $${a^b} \equiv {(a^2)^{\frac{b}{2}}} \pmod{m}\quad b\ is\ even$$ $${a^b} \equiv {(a^2)^{\frac{b}{2}}*a} \pmod{m}\quad b\ is\ odd$$ 那么我们得到这样一

快速幂取模

参考文章来源:Reait  Home(http://www.reait.com/blog.html) 转载请注明,谢谢合作. 在Miller Rabbin测试素数,就用到了快速幂取模的思想.这里总结下.求a^b%c(这就是著名的RSA公钥的加密方法),当a,b很大时,直接求解这个问题不太可能 算法1:利用公式a*b%c=((a%c)*b)%c,这样每一步都进行这种处理,这就解决了a^b可能太大存不下的问题,但这个算法的时间复杂度依然没有得到优化 代码如下: 01.int modexp_simpl

快速幂取模和快乘取模

一.快速幂取模概念 快速幂取模,顾名思义,就是快速的求一个幂式的模(余),比如a^b%c,快速的计算出这个式子的值. 在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法. 二.快速幂取模算法实现 1)很容易能想到,循环b次,每次乘a,最后对c取余就可以了. int ans = 1; for(int i = 1; i<=b; i++) { ans = ans * a; } ans = ans % c; 这个朴素算法的问题是: 1.如果a和b

HDU 4365 正方形格子涂色中心对称轴对称的涂法有多少种-思维-(矩阵坐标关系&amp;快速幂取模)

题意:n*n的格子,涂色,有k种颜料,必须满足旋转任意个90度和翻转之后图片的样子不变,现在已经有m个格子涂过色了,问还有多少种涂法满足上述条件. 分析: 满足上述对称条件,那么涂色的种类问题我们可以放在正方形的一个角来做,因为一个角确定了其他角的颜色也就确定了. 以左上角的下半角为例.共有1+2+....+(n+1)/2个格子,然后记录涂过色的格子对应到这个三角形里的格子数目,用tot来记录,即每输入一个涂过色的格子的坐标我们就在这个三角形里找与之对应的坐标,用vis[][]数组标记是否已经计