zoukankan      html  css  js  c++  java
  • [每日一题2020.06.15]P1226 【模板】快速幂取余运算

    我是题目

    快速幂就是快速求 (a^b)的一种算法

    快速幂

    思想 :

    比如我要求 (6^9)

    首先将幂转化为二进制形式 :

    [6^9 = 6^{1001} ag{1} ]

    可以得到 :

    [6^9 = 6^{2^{3}} imes 6^{2^0} ag{2} ]

    由于一个数变成二进制位数为(log _2oldsymbol{b}) 位, 故相对于直接求幂 ( b位需要b次计算 ), 时间复杂度减小了

    取余

    两条基本性质 :

    [left( oldsymbol{X}+oldsymbol{Y} ight) \,\,\% oldsymbol{a}\,\,=\,\,left( oldsymbol{X}\%oldsymbol{a}+oldsymbol{Y}\%oldsymbol{a} ight) \%oldsymbol{a} ag{1} ]

    [left( oldsymbol{X} imes oldsymbol{Y} ight) \,\,\% oldsymbol{a}\,\,=\,\,left( left( oldsymbol{X}\%oldsymbol{a} ight) imes left( oldsymbol{Y}\%oldsymbol{a} ight) ight) \%oldsymbol{a} ag{2} ]

    上代码

    ll qpow(ll x, ll y, ll mod)  { 
    	ll ans = 1;
    	ll base = x;
    	while(y > 0) {
    		if(y & 1){
    			ans *= base;
    			ans %= mod;
    		}
    		base *= base;
    		base %= mod;
    		y>>=1;
    	}
    	return ans % mod;
    }
    

    不取余的版本

    ll qpow(ll x, ll y)  { 
    	ll ans = 1;
    	ll base = x;
    	while(y > 0) {
    		if(y & 1){
    			ans *= base;
    		}
    		base *= base;
    		y>>=1;
    	}
    	return ans;
    }
    

    与pow的时间比较

    对比一下时间 :

    快速幂 : 0.796s

    1592038473517

    普通求幂 :2.092s

    1592038476688

  • 相关阅读:
    HTML介绍
    python D41 前端初识
    mysql索引原理与查询优化
    python D41
    python D40 pymsql和navicat
    python D40 以及多表查询
    python D35 selectors模块
    python D35 I/O阻塞模型
    测试过程
    测试基础
  • 原文地址:https://www.cnblogs.com/roccoshi/p/13118169.html
Copyright © 2011-2022 走看看