快速幂
//快速幂的实现部分,相当于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; }
浙公网安备 33010602011771号