华硕编程竞赛11月JAVA专场 A题自由弹簧 题解

简介: 华硕编程竞赛11月JAVA专场 A题自由弹簧 题解

题目链接:题目链接

题面:

小王一直都想在太空遨游,但是现在的他并没有这个超能力,所以他买了个 “自由弹簧” 打算过过瘾。

这个 ”自由弹簧“ 在初次使用时,会将小王弹射到 N( 2 <= N <= 200000) 米的高度,当弹簧落地时,会触发 ”自由弹簧“ 的超能力,会自动将小王弹射到 N * N 米的高度!

”自由弹簧“ 的生产者设置了一道保护机制,当弹射高度 N 超过 100000007 米时,会自动将高度降低 N % 100000007 米的位置,以此保证小王的安全。

但 ”自由弹簧“ 也有使用寿命,当落地 M ( 2 <= M <= 200000)次(不含初次使用时的落地情况)之后,将不会再进行弹射,最终会将小王安全送回地面,并且自动消失。

小王想知道,当 ”自由弹簧“ 最后一次弹射时,会弹射到多高的高度 X ?(米,如 X 超过100000007 ,则求自动降低后的高度)

本次挑战需要你至少了解一些 Java 中整数的基本运算和幂运算,了解快速幂的计算流程。

知识点

  • 整数的基本运算
  • 整数幂运算
  • 快速幂取模

初始代码

public class AMain {
    private static final long MOD = 100000007;
    // 请勿修改 doWork() 的方法名和参数类型
    public static long doWork(long n,long m) {
        long ans = 1;
        //代码编辑区 开始
        //代码编辑区 结束
        return ans;
    }
    public static void main(String[] args) {
        //测试用例
        System.out.printf((Objects.equals(2048L,doWork(2, 10)) ? "【√正确】" : "【X错误】") + "初始速度%d,寿命%d次,最后弹射高度%d\n",2,10,doWork(2, 10));
        System.out.printf((Objects.equals(729L,doWork(3, 5)) ? "【√正确】" : "【X错误】") + "初始速度%d,寿命%d次,最后弹射高度%d\n",3,5,doWork(3, 5));
        System.out.printf((Objects.equals(29516713L,doWork(9, 11)) ? "【√正确】" : "【X错误】") + "初始速度%d,寿命%d次,最后弹射高度%d\n",3,5,doWork(9, 11));
        System.out.printf((Objects.equals(99898098L,doWork(99999, 88888)) ? "【√正确】" : "【X错误】") + "初始速度%d,寿命%d次,最后弹射高度%d\n",99999,88888,doWork(99999, 88888));
    }
}

样例说明

输入首次弹射高度 N 和弹射次数 M,输出最后一次弹射的高度。

如首次弹射高度 N = 2,弹射次数为 10,最后一次弹射的高度为 2048 米,则输出 2048。

如首次弹射高度 N = 3,弹射次数为 5,最后一次弹射的高度为 729 米,则输出 729。

如首次弹射高度 N = 9,弹射次数为 11,最后一次弹射的高度为 29516713 米,则输出 29516713 。

题解

签到题,考察快速幂取模,对于初次使用高度 N 和使用寿命次数 M,最后一次弹射高度等于 N 的 (M + 1) 次幂对 100000007 取模

参考代码如下:

import java.util.Objects;
public class AAns {
    private static final long MOD = 100000007;
    public static long doWork(long n,long m) {
        long ans = 1;
        //代码编辑区 开始
        m ++;
        long number = n % MOD;
        while(m > 0) {
            if((m & 1) > 0) {
                ans = (ans * number) % MOD;
            }
            number = (number * number) % MOD;
            m /= 2;
        }
        //代码编辑区 结束
        return ans;
    }
    public static void main(String[] args) {
        //测试用例
        System.out.printf((Objects.equals(2048L,doWork(2, 10)) ? "【√正确】" : "【X错误】") + "初始速度%d,寿命%d次,最后弹射高度%d\n",2,10,doWork(2, 10));
        System.out.printf((Objects.equals(729L,doWork(3, 5)) ? "【√正确】" : "【X错误】") + "初始速度%d,寿命%d次,最后弹射高度%d\n",3,5,doWork(3, 5));
        System.out.printf((Objects.equals(29516713L,doWork(9, 11)) ? "【√正确】" : "【X错误】") + "初始速度%d,寿命%d次,最后弹射高度%d\n",3,5,doWork(9, 11));
        System.out.printf((Objects.equals(99898098L,doWork(99999, 88888)) ? "【√正确】" : "【X错误】") + "初始速度%d,寿命%d次,最后弹射高度%d\n",99999,88888,doWork(99999, 88888));
    }
}

总结

要 AC 本题,必须学会快速幂取模的算法。

使用快速幂取模可以将原有的 O(N)的时间复杂度降为 O(log (2,N)),从而通过本题。


相关文章
|
1天前
|
Java
深入理解Java并发编程:线程池的应用与优化
【5月更文挑战第18天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将了解线程池的基本概念,应用场景,以及如何优化线程池的性能。通过实例分析,我们将看到线程池如何提高系统性能,减少资源消耗,并提高系统的响应速度。
11 5
|
1天前
|
消息中间件 安全 Java
理解Java中的多线程编程
【5月更文挑战第18天】本文介绍了Java中的多线程编程,包括线程和多线程的基本概念。Java通过继承Thread类或实现Runnable接口来创建线程,此外还支持使用线程池(如ExecutorService和Executors)进行更高效的管理。多线程编程需要注意线程安全、性能优化和线程间通信,以避免数据竞争、死锁等问题,并确保程序高效运行。
|
1天前
|
安全 Java 容器
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第18天】随着多核处理器的普及,并发编程变得越来越重要。Java提供了丰富的并发编程工具,如synchronized关键字、显式锁Lock、原子类、并发容器等。本文将深入探讨Java并发编程的核心概念,包括线程安全、死锁、资源竞争等,并分享一些性能优化的技巧。
|
1天前
|
安全 Java 开发者
Java中的多线程编程:理解与实践
【5月更文挑战第18天】在现代软件开发中,多线程编程是提高程序性能和响应速度的重要手段。Java作为一种广泛使用的编程语言,其内置的多线程支持使得开发者能够轻松地实现并行处理。本文将深入探讨Java多线程的基本概念、实现方式以及常见的并发问题,并通过实例代码演示如何高效地使用多线程技术。通过阅读本文,读者将对Java多线程编程有一个全面的认识,并能够在实际开发中灵活运用。
|
2天前
|
Java 编译器
Java并发编程中的锁优化策略
【5月更文挑战第18天】在Java并发编程中,锁是一种常用的同步机制,用于保护共享资源的访问。然而,不当的锁使用可能导致性能问题和死锁风险。本文将探讨Java中锁的优化策略,包括锁粗化、锁消除、锁分离和读写锁等技术,以提高并发程序的性能和可靠性。
|
2天前
|
Java 编译器
Java 并发编程中的锁优化策略
【5月更文挑战第17天】在 Java 并发编程中,锁是一种常见的同步机制,用于保护共享资源的访问。然而,不当使用锁可能导致性能问题和死锁风险。本文将探讨 Java 中的锁优化策略,包括锁粗化、锁消除、锁降级以及读写锁等技术,以提高并发程序的性能和可靠性。
|
2天前
|
Java 编译器
Java并发编程中的锁优化策略
【5月更文挑战第17天】在Java并发编程中,锁是一种常见的同步机制,用于保护共享资源。然而,使用不当的锁可能导致性能下降和死锁等问题。本文将探讨Java中锁的优化策略,包括锁粗化、锁消除、锁排序等方法,以提高程序的性能和可靠性。
|
3天前
|
存储 关系型数据库 MySQL
《MySQL 入门教程》第 05 篇 账户和权限,Java高并发编程详解深入理解pdf
《MySQL 入门教程》第 05 篇 账户和权限,Java高并发编程详解深入理解pdf
|
3天前
|
NoSQL Dubbo Java
StringBoot编程式事务与声明式事务java工程师面试突击第一季
StringBoot编程式事务与声明式事务java工程师面试突击第一季
|
4天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第15天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将通过实例分析,理解线程安全的重要性,并学习如何通过各种技术和策略来实现它。同时,我们也将探讨如何在保证线程安全的同时,提高程序的性能。