快速幂取模

即快速求出(a^b)mod c 的值。由于当a、b的值非常大时直接求a^b可能造成溢出,并且效率低。

思路

原理就是基于\(a*b \% c = ((a \% c)*(b \% c))\% c\),\(a^b \% c = (a \% c)^b \% c\)公式。

求解快速幂:

设指数b用二进制表示为\(b = (b_n b_{n-1}...b_2b_1b_0)_2\),

\(b = b_0 + b_1*2^1 + b_2*2^2+...+b_{n-1}*2^{n-1} + b_n*2^n\),

\(a^b = a^{b_0 + b_1*2^1 + b_2*2^2+...+b_{n-1}*2^{n-1} + b_n*2^n} = a^{b0}*a^{b_1*2^1}*a^{b_2*2^2} *...*a^{b_{n-1}*2^{n-1}} * a^{b_n*2^n}\),

\(a^b \% c = a^{b0}*a^{b_1*2^1}*a^{b_2*2^2} *...*a^{b_{n-1}*2^{n-1}} * a^{b_n*2^n} \% c\),

设\(K_n = (a^{b_n*2^n})\%c\),求Kn的话,当bn=0时Kn=1,bn=1时\(Kn=(a^{2^n})\%c\),因此再考虑计算\((a^{2^n})\%c\)。

\((a^{2^n})\%c = [(a^{2^{n-1}}\%c)*(a^{2^{n-1}}\%c)]\%c\)由此递推。

代码

python

  1. def quick_powmod(a, b, c):
  2. a = a % c
  3. ans = 1 # 存放结果
  4. while b != 0:
  5. if b & 1: # 二进制与
  6. ans = (ans * a) % c
  7. a = (a * a) % c # 取模是防止溢出
  8. b >>= 1 # 二进制向右移动一位
  9. return ans

例如a=2 b=10 c=3,b的二进制表示为1010。

\(2^{10} = 2^{0+ 1*2^1+0*2^2+1*2^3}\),b的二进制位从右往左取,为0时,累乘a,为1时,将累乘结果乘到ans里。

快速乘取模

使用二进制将乘法转换为加法。

思路

与快速幂取模类似,将一个乘数转换为二进制计算。

例如\(20*14 = 20*(1110)_2 = 20*2^0*0 + 20*2^1*1+20*2^2*1+20*2^3*1\)

代码

Python

  1. def quick_mulmod(a, b, c):
  2. ans = 0
  3. a = a % c
  4. while b != 0:
  5. if b & 1 :
  6. ans = (ans + a) % c
  7. a = (2*a) % c
  8. b >>= 1
  9. return ans

乍一看还是很不好懂的,举个例子推导一遍就明白了。

快速幂取模&快速乘取模的更多相关文章

  1. 乘方快速幂 OR 乘法快速幂

    关于快速幂这个算法,已经不想多说,很早也就会了这个算法,但是原来一直靠着模板云里雾里的,最近重新学习,发现忽视了一个重要的问题,就是若取模的数大于int型,即若为__int64的时候应该怎么办,这样就 ...

  2. Educational Codeforces Round 13——D. Iterated Linear Function(矩阵快速幂或普通快速幂水题)

      D. Iterated Linear Function time limit per test 1 second memory limit per test 256 megabytes input ...

  3. 51nod 1113 矩阵快速幂( 矩阵快速幂经典模板 )

    1113 矩阵快速幂 链接:传送门 思路:经典矩阵快速幂,模板题,经典矩阵快速幂模板. /******************************************************* ...

  4. 【转】C语言快速幂取模算法小结

    (转自:http://www.jb51.net/article/54947.htm) 本文实例汇总了C语言实现的快速幂取模算法,是比较常见的算法.分享给大家供大家参考之用.具体如下: 首先,所谓的快速 ...

  5. 快速幂取模_C++

    一.题目背景 已知底数a,指数b,取模值mo 求ans = ab % mo 二.朴素算法(已知可跳过) ans = 1,循环从 i 到 b ,每次将 ans = ans * a % mo 时间复杂度O ...

  6. NYOJ-676小明的求助,快速幂求模,快速幂核心代码;

    小明的求助 时间限制:2000 ms  |  内存限制:65535 KB 难度:2 描述 小明对数学很有兴趣,今天老师出了道作业题,让他求整数N的后M位,他瞬间感觉老师在作弄他,因为这是so easy ...

  7. hdu4549 矩阵快速幂 + 欧拉降幂

    R - M斐波那契数列 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit  ...

  8. 矩阵快速幂——POJ3070

    矩阵快速幂和普通的快速幂差不多,只不过写起来比较麻烦一点,需要重载*运算符. 模板: struct mat { int m[maxn][maxn]; }unit; mat operator * (ma ...

  9. [学习笔记]快速幂&&快速乘

    本质:二进制拆分(你说倍增我也没脾气).然后是一个配凑. 合起来就是边二进制拆分,边配凑. 快速乘(其实龟速):把乘数二进制拆分.利用乘法分配率. 用途:防止爆long long 代码: ll qk( ...

  10. 快速幂C++实现

    快速幂模板题 很明显,这个题目不能用简单的\(for\)循环+\(mod\)来完成,因为指数\(p\)已经达到了长整型,直接循环来完成的话肯定会超时的. 那么快速幂就应运而生了. 什么是快速幂呢? 利 ...

随机推荐

  1. Ctrl + Shift + F7 ; F3、Shift + F3

    pycharm 查找并高亮参数 选中某一参数,Ctrl + Shift + F7  高亮所有该文件中所有该参数 接下来, 按 F3 在所有高亮选择中向下移动一个, Shift + F3 在所有高亮选择 ...

  2. Spring Cloud第五篇 | 服务熔断Hystrix

    ​ 本文是Spring Cloud专栏的第五篇文章,了解前四篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Clo ...

  3. HDU2242 考研路茫茫——空调教室 (双联通分+树形DP)

    考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. 洛谷 题解 P1615 【西游记公司】

    我的程序只有1行... return scanf("%d:%d:%d\n%d:%d:%d\n%d", &a, &b, &c, &x, &y, ...

  5. Orleans 序列化遇到的坑

    真的是巨坑 搞明白问题的我简直无法用言语来描述我的心情 先上架构图 理想中的架构 服务随便上 网关只负责分发 然后跟随官方教程写遇到了序列化问题 以前有经验,不慌,以前稀里糊涂就搞定了. 再然后遇到一 ...

  6. 轻松构建基于 Serverless 架构的弹性高可用音视频处理系统

    前言 随着计算机技术和 Internet 的日新月异,视频点播技术因其良好的人机交互性和流媒体传输技术倍受教育.娱乐等行业青睐,而在当前, 云计算平台厂商的产品线不断成熟完善, 如果想要搭建视频点播类 ...

  7. 【Jackson】使用学习

    Jackson学习 文档:http://tutorials.jenkov.com/java-json/index.html https://github.com/FasterXML/jackson/w ...

  8. koa安装教程

    此安装是在windows下进行 1.全局安装 npm install -g koa-generator 安装成功后会出现以下信息 创建项目 koa2 -e koa2-learn 2.1 -e指的是使用 ...

  9. NodeJS7-1本地构建_gulp入门学习

    NodeJS在前端最常用的两种方式: 1.做成webserver 2.做成前端开发的相关工具 本地构建:前端发布代码都会经过压缩(谁来处理) ,前端技术的日新月异,利用新特性代码变得易读,清晰,可是老 ...

  10. ACM-ICPC 2018 南京赛区网络预赛 L. Magical Girl Haze (分层dijkstra)

    There are NN cities in the country, and MMdirectional roads from uu to v(1\le u, v\le n)v(1≤u,v≤n). ...