题目:
![](https://i-blog.csdnimg.cn/blog_migrate/a481f40b44cf33fa1326d9cd21ce42d1.png)
题目要求是得到最大的M。
本题需要用到快速幂算法。
大佬思路:
对N进行拆解,拆解为2和3(只保留 3 和 2 这两个数字,相乘得到的M最大)
拆解过程中尽可能的多拆解出来3,其次是2。
那么该如何确定3和2的数量呢?
通过对N进行mod 3 运算,%3后的结果必是0或1或2。
如果取模结果为0,说明N可以被3整除,全部取3即可。
如果取模结果为1,说明N缺少2凑成3,那么直接商-1即减去1个3,减去的3与余数凑成4,即2+2,虽然是2+2,但是在计算M的时候是相乘,所以是*4.
如果取模结果为2,那么直接就是+2,也就是*2.
快速幂取模问题:
为了防止变量超界,我们根据取模运算的性质对取模过程进行修改,让乘法过程每一步都进行取模运算。具体可看 快速幂问题 。
本题代码:
#include<stdio.h>
typedef long long ll;
int func(ll a,ll b){
int temp=1;
while(b){
if(b&1){ //奇数
temp=(temp*a)%5201314;
}
a=(a*a)%5201314;
b/=2;
}
return temp;
}
int main()
{
ll a,res;
scanf("%lld",&a);
if(a==1){
printf("1");
return 0;
}
if(a%3==0){
res = func(3,a/3);
}else if(a%3==2){
res = 2*func(3,a/3);
}else {
res = 4*func(3,a/3-1);
}
res%=5201314;
printf("%lld",res);
return 0;
}