蓝桥杯练习题——数的潜能(java版)

一、题目描述

将一个数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的方法参照其他的文章学习到的,还需要多加练习才能自己想到解法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值