蓝桥杯——ALGO999——数的潜能

通过万岁!!!

  • 题目:就是给你一个数字n,然后n=a1+a2+…+ak,然后m等于这些数字的成绩,求m,并且使得m最大。但是题目有点不好,就是没有要求这个m,其实应该说一下,m是要求最大的。
  • 思路:首先我们得发现一个规律,就是我们对n分解,分解到2和3的时候,这样能得到m是符合目标的,然后就是找2和3的个数。最终计算的到m。
  • 技巧:这里用到了快速幂,否则的话会超时的。
  • 注意:这里n要死小于3的话,直接输出n就可以了。
  • 题目链接:http://lx.lanqiao.cn/problem.page?gpid=T2984

java代码

import java.util.ArrayList;
import java.util.Scanner;


/**
* @创建人 xcs
* @创建日期 2022/3/22
* @创建时间 14:46
* 题目链接:http://lx.lanqiao.cn/problem.page?gpid=T2984
*/
public class ALGO999 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long n = scanner.nextLong();
        if (n <= 2) {
            System.out.println(n);
            return;
        }
        // 统计3的个数和2的个数
        long threeNum;
        int twoNum = 0;
        if (n % 3 == 1) {
            threeNum = (n / 3) - 1;
            twoNum = 2;
        } else if (n % 3 == 2) {
            threeNum = n / 3;
            twoNum = 1;
        } else {
            threeNum = n / 3;
        }
        // 接下来用快速幂进行求解,3的threeNum次方
        // 定义次幂以及次幂的结果
        ArrayList<Long> powers = new ArrayList<>();
        ArrayList<Long> results = new ArrayList<>();
        long power = 1;
        long ans = 3;
        // 添加一次幂和一次幂的结果
        powers.add(power);
        results.add(ans);

        while (threeNum >= power * 2) {
            power *= 2;
            ans = ans * ans % 5218;
            // 这里我们存储一下计算结果,这样接下来用到就不用计算了
            powers.add(power);
            results.add(ans);
        }
        // 这时候我们已经计算了3的temp次方了还需要计算threeNum-temp次
        threeNum -= power;
        for (int i = powers.size() - 1; i >= 0; --i) {
            if (powers.get(i) <= threeNum) {
                // 之前算过的,离threeNum最大的
                ans = ans * results.get(i) % 5218;
                threeNum -= powers.get(i);
            }
        }
        ans = ans * (long) Math.pow(2, twoNum) % 5218;
        System.out.println(ans);
    }
}
  • 总结:这里首先需要找到这个规律,就是我们分解到2和3的时候进行相乘就是最终结果。然后就是用快速幂了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值