• 二分快速幂


    二分快速幂

    求a的b次方,自定义pow库函数:

    pow(a, b)是数学头文件math.h里面有的函数,但是它返回值是double类型,数据有精度误差。
    可以改成这样:

    long long pow(long long a, long long b){
        long long ret = 1;
        for(long long i = 1; i <= b; i ++){
            ret *= a;
        }
        return ret;
    }
    

    二分快速幂:

    数据量大会超时,使用自定义的pow也要超时,这时候要使用二分快速幂了

    代码模板:

    递归写法

    	const int MOD=1e9+7;
    	typedef long long ll;
    	
    	ll pow_mod(ll a, ll b){//a的b次方
    	    if(b == 0) return 1%MOD;
    	    ll ret = pow_mod(a, b/2);
    	    ret = ret * ret % MOD;
    	    if(b % 2 == 1) ret = ret * a % MOD;
    	    return ret;
    	}
    

    循环写法:

    #include<bits/stdc++.h>
    using namespace std;
    int pow_mod(int a, int n, int mod)
    {
        long long ans = 1;
        while(n){
            if(n&1){
                ans = (ans * a) % mod;
            }
            a = (a * a) % mod;
            n >>= 1;
        }
        return ans;
    }
    int main()
    {
        int a, n, mod;
        cin >> a >> n >> mod;
        cout << pow_mod(a, n, mod);
    }
    
    

    快速乘:

    LL mul(LL a, LL b, LL p){//快速乘,计算a*b%p 
        LL ret = 0;
        while(b){
            if(b & 1) ret = (ret + a) % p;
            a = (a + a) % p;
            b >>= 1;
        }
        return ret;
    }
  • 相关阅读:
    [POI2007]山峰和山谷Grz
    [POI2007]驾驶考试egz
    [POI2007]立方体大作战tet
    BZOJ1085 [SCOI2005]骑士精神
    BZOJ1975 [Sdoi2010]魔法猪学院
    codeforces754D Fedor and coupons
    UOJ79 一般图最大匹配
    BZOJ3944 Sum
    BZOJ3434 [Wc2014]时空穿梭
    UOJ58 【WC2013】糖果公园
  • 原文地址:https://www.cnblogs.com/fisherss/p/10012340.html
Copyright © 2020-2023  润新知