快速幂

//快速幂的实现部分,相当于ans=pow(base,exponent)
        while(exponent){
            if(exponent&1) ans=ans*base;
            base=base*base;//基底
            exponent>>=1;//指数
        }

例题:

问题描述
  将一个数N分为多个正整数之和,即N=a1+a2+a3+…+ak,定义M=a1*a2*a3*…*ak为N的潜能。
  给定N,求它的潜能M。
  由于M可能过大,只需求M对5218取模的余数。
输入格式
  输入共一行,为一个正整数N。
输出格式
  输出共一行,为N的潜能M对5218取模的余数。
样例输入
10
样例输出
36
数据规模和约定
  1<=N<10^18
代码实现:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
//正整数分解,使得乘积最大
//需要把一个正整数分为多个3相加
//最后一个数小于等于4时停止
int fast_pow(ll m,ll h){
    ll ans=1;
    int num=3;
    if(m==0) return h;
    else if(m==1&&h==0) return 3;
    else{
        //快速幂的实现部分,相当于ans=pow(num,m)
        while(m){
            if(m&1) ans=ans*num%5218;
            num=num*num%5218;//基底
            m>>=1;//指数
        }
    }
    return ans*h%5218;
}
int main(){
    cin>>n;
    ll m,h;
    m=n/3;
    h=n%3;
    if((h==1)&&(m>0)){
        m-=1;
        h=4;
    }else if((m!=0)&&(h==0)){
        h=1;
    }
    cout<<fast_pow(m,h);
    return 0;
}

 

posted @ 2023-10-18 18:40  yhstsy  阅读(14)  评论(0)    收藏  举报