一、题目描述
将一个数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
七、实现思路
因为要将整数分解为若干整数,并且使得他们的乘积最大。
分为三种情况
1.被3整除的数字 例如:9=3+3+3
2.被3除余1的数字(可以分成3+3+...+2或者3+3+...+4) 例如:10 = 3+3+4
3.被3除余2的数字(可以分成3+3+...+2) 例如:11 = 3+3+3+2
八、代码实现
import java.util.*;
public class Main {
static int num ;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long N = sc.nextLong();
int goal = 0;
long M =0;
if(N <= 2) {
System.out.println(N);
}else {
goal = (int)(N%3);
if(goal == 0) {
M = fastPower(3,(N/3));
System.out.println(M);
}else if(goal == 1) {
M = fastPower(3,(N/3))*4%5218;
System.out.println(M);
}else if(goal == 2) {
M = fastPower(3,(N/3))*2%5218;
System.out.println(M);
}
}
}
//快速幂运算方法 当指数为数 底数平方 指数/2
private static long fastPower(long base,long power) {
long result = 1;
while(power > 0) {
if((power&1)==1) {
//判断指数是否为奇数 5->5/2=2
result = result *base%5218;
}
power >>= 1; //相当于将power减半 power /= 2;
base = (base*base)%5218;
}
return result;
}
}
九、总结
此题用到了快速幂算法,代码中有注释,对于此类优化方法还需要多加学习。
关于分解成3的方法参照其他的文章学习到的,还需要多加练习才能自己想到解法。