• 快速幂


    前置知识

    用二进制表示数字的方法(需要熟练理解)

    基本思想

    快速幂的基本思想就是将运算进行"降幂",再利用二进制数字合并的原理减少运算次数。

    例如,计算a^b则需要不停计算a*a;同理,计算a*b则需要不停计算a+a。

    例题

    1.求 a 的 b 次方对 p 取模的值,其中 1≤a,b,p≤10^9。(题目链接

    #include<cstdio>
    #include<iostream>
    #define ll long long
    using namespace std;
    ll poww(ll a,ll b,ll p){
    	ll ans=1;
    	for(;b;b>>=1){
    		if(b&1)ans=(ll)ans*a%p;
    		a=(ll)a*a%p;
    	}
    	return ans%p;
    }
    int main(){
    	ll a,b,p;
    	cin>>a>>b>>p;
    	cout<<poww(a,b,p)<<endl;
    	return 0;
    }

    2.求 a 乘 b 对 p 取模的值,其中 1≤a,b,p≤10^18。(题目链接

    这个题可以说是利用了快速幂的思想,即将一个乘法转换为多个加法,本质上与快速幂类似。

    #include<cstdio>
    #include<iostream>
    #define ll long long
    using namespace std;
    ll mul(ll a,ll b,ll p){
    	ll ans=0;
    	for(;b;b>>=1){
    		if(b&1)ans=(ans+a)%p;
    		a=a*2%p;
    	}
    	return ans%p;
    }
    int main(){
    	ll a,b,p;
    	scanf("%lld%lld%lld",&a,&b,&p);
    	printf("%lld
    ",mul(a,b,p));
    	return 0;
    }
  • 相关阅读:
    CGCDSSQ
    100200H
    斗地主
    借教室
    bzoj 3743
    17B
    能量项链
    589
    16-求连续数组和最大
    15-幸运数组4、7
  • 原文地址:https://www.cnblogs.com/zbsy-wwx/p/11680632.html
Copyright © 2020-2023  润新知