蓝桥杯2023A-05-互质数(Java)

5.互质数

  • 题目描述

给定 a, b,求 1 ≤ x < a^b 中有多少个 x 与 a^b 互质。由于答案可能很大,你只需要输出答案对 998244353 取模的结果。

输入格式

输入一行包含两个整数分别表示 a, b,用一个空格分隔。

输出格式

输出一行包含一个整数表示答案。

样例输入

2 5

样例输出

16
  • 题目分析
1.快速幂求解a^b: 要想求解a^b对于b的值越来越大,可能会导致运算超时,此时我们可以使用快速幂算法,通过快速幂算法我们可以很快的求解出a^b的值2.欧拉降指数函数:如果要求 1 ≤ x < a^b 中有多少个 x 与 a^b 互质,可以采用欧拉函数3.结合上面俩个关键点我们便可解决此题,下面一一介绍这两种算法
  • 快速幂算法

介绍

快速幂算法(Fast Exponentiation Algorithm)是一种用于快速计算大数的指数幂的算法。在计算机科学和数学中,它是一种高效的方法,用于计算形如 x^n 的表达式,其中 x 是任意实数,n 是一个非负整数。传统的指数运算方法的时间复杂度为 O(n),而快速幂算法的时间复杂度为 O(log n),因此在处理大数时非常高效。

实现思路

这个算法的基本思想是利用指数的二进制表示。例如,若指数 n 的二进制表示为 1101,那么 x^n 就可以分解为 x^(2^0) * x^(2^2) * x^(2^3),其中指数的二进制表示中,为 1 的位置对应着 x^n 中需要相乘的部分。这样就可以通过分治的方式,快速计算出 x^n。

Java代码

举例说明:
1024^105
对于整数105的可以分解为64 + 32 + 8 + 1
转换成二进制数可以表现为1101001
1024^1 = 1024
1024^2 = 1024^1024
1024^4 = 1024^2 * 1024^2
1024^8 = 1024^4 * 1024^4
1024^16 = 1024^8*1024^8
1024^32 = 1024^16*1024^16
1024^64 = 1024^64*1024^64private static long quickPower(long a, long b) {//a为底数, b为指数long result = 1;while(b > 0) {if (b & 1 == 1) {//如果二进制末位为1result = result * a;}a = a * a;//表示每一位二进制数要乘的数b = b >> 1;//将二进制数向右移动一位进行缩小  }return result;
}
  • 欧拉函数

介绍

欧拉函数(Euler's Totient Function)是一个在数论中非常重要的函数,通常用符号φ(n)表示。对于正整数n,欧拉函数φ(n)定义为小于等于n且与n互质的正整数的个数。
例如,当n=8时,与8互质的正整数是1, 3, 5, 7,因此φ(8) = 4

性质:

欧拉函数有许多有用的性质,其中一些包括:
1. 若p为质数,则φ(p) = p - 1。这是因为质数p的所有小于p的正整数都与p互质。
2. 若m和n互质,则φ(mn) = φ(m)φ(n)。这是欧拉函数的乘性性质。
3. 对于任意正整数n,欧拉函数满足以下的递归关系式:若n可以分解为素数因子的乘积,则φ(n) = n(1 - 1/p1)(1 - 1/p2)...(1 - 1/pk),其中p1, p2, ..., pk是n的不同素因子。

Java实现:

  1. 初始化结果为n。
  2. 对n进行质因数分解,从2开始逐个检查可能的质因数i。
  3. 如果当前数能够整除n,则说明i是n的一个质因数,进入循环,不断将n除以i,直到不能整除为止,排除掉n中所有的i因数。
  4. 更新result,减去由i引起的不同的因子个数,即result除以i的整数部分。
  5. 处理剩余的质因数,如果n大于1,说明n本身就是一个质数,更新result,减去由n引起的不同的因子个数,即result除以n的整数部分。
  6. 返回最终计算结果。
举例
n = 15
n % 2=0 表明2不是n的因数
n % 3 == 0 表明3是n的因数n/3 = 5result = result - result / 3 表明小于n的质因数不是3的倍数/*由于 4 * 4大于15,因而4之后的元素要么重复,要么不是15的质因数,即i*i <= n解释:对于p * q = n 必然存在一个较大的p和一个较小的q(或者二者相等,若q*q大于n则p和q一定不是n的质数)*/
剩余较大的因数n = 5result = result - result / 5为最终结果private static long Euler(long n) {// 计算欧拉函数值long result = n; // 初始化结果为n// 对n进行质因数分解for (long i = 2; i * i <= n; i++) { // 从2开始逐个检查可能的质因数if (n % i == 0) { // 如果当前数能够整除n,即i是n的一个质因数while (n % i == 0) { // 循环直到n不能再被i整除为止,排除掉n中所有的i因数n /= i; // 不断将n除以i,直到不能整除为止}result = result - result / i; // 更新result,减去由i引起的不同的因子个数,即result除以i的整数部分}}// 处理剩余的质因数if (n > 1) { // 如果n本身就是一个质数result = result - result / n; // 更新result,减去由n引起的不同的因子个数,即result除以n的整数部分}return result; // 返回最终计算结果
}
  • Java代码实现
static final long MOD = 998244353;public static void main(String[] args) {Scanner sc = new Scanner(System.in);long a = sc.nextLong();long b = sc.nextLong();//欲求小于等于a^b有几个质数与其互质//1.要求小于等于某个数并与其互质个数--->欧拉函数//2.要求某个数的幂次--->快速幂算法System.out.println(Euler(a) * quickPower(a, b - 1) % MOD);}//欧拉降指数函数,用符号φ(n)表示,表示小于等于n且与n互质的正整数的个数。private static long Euler(long n) {// 10long result = n; // 初始化结果为n// 对n进行质因数分解for (long i = 2; i * i <= n; i++) {// 2是质数if (n % i == 0) {// 如果n模2为0,表明存在公因式为2的因数while (n % i == 0) {// 一直与2取余数并除以2使得结果中不再有2的因数n /= i;}result = result - result / i;}}// 处理剩余的质因数if (n > 1) {result = result - result / n;}return result;}//快速幂函数private static long quickPower(long a, long b) {long result = 1;while (b > 0) {//判断末尾位是否在二进制中为1if ((b & 1) == 1) {result = (result * a) % MOD;  // 对结果取模,避免溢出}a = (a * a) % MOD;  // 对中间结果取模,避免溢出//将二进制数向右移1位,使得去掉末尾b = b >> 1;}return result;}

System.out.println(Euler(a) * quickPower(a, b - 1) % MOD);的解释

image-20240409123314611

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue2电商前台项目(三):完成Search搜索模块业务

目录 一、请求数据并展示 1.写Search模块的接口 2.写Vuex中的search仓库&#xff08;三连环&#xff09; 3.组件拿到search仓库的数据 用getters简化仓库中的数据 4.渲染商品数据到页面 5.search模块根据不同的参数获取数据展示 &#xff08;1&#xff09;把派发actions…

使用MobaXterm/winTerm之类的工具连接虚拟机时报错Permission denied或者Access denied的解决办法

一、虚拟机设置&#xff1a; 1.将点击【编辑】---> 【虚拟网络编辑器】 2.添加VMnet6 1&#xff09;点击【DHCP设置】--->添加网络--->选中【仅主机模式】【将主机虚拟适配器连接到此网络】 2&#xff09;子网ip写“192.168.66.0” 3&#xff09;点击右下角【应用…

精准识别更安全,横扫六大手指难题的鹿客指脉锁S6 Max来了

极致的自然动作、极致的精准识别、识别时间600毫秒……在4月10日鹿客指脉锁S6 Max发布会上&#xff0c;高密度的关键词让关注发布会的所有人都意识到&#xff0c;下一代智能锁真的来了。 鹿客也将新品S6 Max称为“行业内、搭载全新一代指脉技术的革新之作”。 1、十年回答&…

Web 前端性能优化之八:前端性能检测实践

五、前端性能检测实践 1、常用的检测工具 Lighthouse、Chrome开发者工具中与性能检测相关的一些工具面板、页面加载性能分析工具PageSpeed Insights、专业的性能检测工具WEBPAGETEST等 1、Chrome 任务管理器 通过Chrome任务管理器我们可以查看当前Chrome浏览器中&#xff0…

蓝桥杯真题 字串简写 前缀和

&#x1f468;‍&#x1f3eb; Acwing 字串简写 输入 4 abababdb a b输出 6&#x1f496; 前缀和 import java.util.Scanner;public class Main {static int N (int) 5e5 10;static int[] l new int[N];// l[i] 表示 i 以及 i 左边包含多少个字符 apublic static void …

Hugo 配置个人博客

下载 Hugo 下载地址: https://www.gohugo.org/ 或者点击百度云链接下载安装包: 链接&#xff1a;https://pan.baidu.com/s/1s2GuNuUKDjEXRzXgCvEYHQ?pwd6666 提取码&#xff1a;6666 安装 Hugo 在文件夹内建立新的文件夹, 在再内部建立两个文件夹, 分别命名为 bin 和 site.…

权威报道 | 百分点科技:《突发事件应急预案管理办法》解读

近日&#xff0c;百分点科技CTO刘译璟作为唯一企业界代表&#xff0c;接受应急领域权威期刊——《中国应急管理》杂志邀请&#xff0c;与中国安全生产科学研究院、中央党校、中国政法大学等单位的专家一起&#xff0c;就《突发事件应急预案管理办法》&#xff08;以下简称《办法…

【数据库】数据库应用系统生命周期

目录 1.为什么提出”软件工程“的思想&#xff1f; 2.为什么提出”瀑布模型“&#xff1f;缺点是什么&#xff1f; 3.为什么提出”快速原型模型“&#xff1f; 4.为什么提出”螺旋模型“&#xff1f; 5.关于数据库的英文缩写。 6.模型设计中的3条设计主线&#xff1a;数…

【快捷部署】015_Minio(latest)

&#x1f4e3;【快捷部署系列】015期信息 编号选型版本操作系统部署形式部署模式复检时间015MiniolatestCentOS 7.XDocker单机2024-04-09 一、快捷部署 #!/bin/bash ################################################################################# # 作者&#xff1a;c…

JVM调优-简介(一)

一、什么是JVM调优&#xff1f; JVM调优是指针对Java虚拟机&#xff08;JVM&#xff09;的配置和运行时环境进行优化和调整&#xff0c;以提高Java应用程序的性能、稳定性和可维护性的过程。JVM调优涉及多个方面&#xff0c;包括内存管理、垃圾回收、线程管理、类加载、运行时参…

【电控笔记5】pi参数整定

旋转坐标系下的电压方程&#xff0c;由id和iq计算出ud和uq 把常数项&#xff08;上面两个红框&#xff09;拿出来解耦合&#xff0c;作为前馈&#xff0c;如下 电流环传递函数 电流带宽 响应时间

顺序表讲解

一.数据结构 在学习顺序表之前&#xff0c;我们先需要了解什么是数据结构。 1.什么是数据结构呢&#xff1f; 数据结构是由“数据”和结构两词组合而来。 什么是数据呢&#xff1f; 你的游戏账号&#xff0c;身份信息&#xff0c;网页里的信息&#xff08;文字&#xff0c…

构造析构理解与拷贝函数初识

1. 6个默认成员函数 ----初始化和清理{ 1.构造 2.析构 } -----拷贝复制{ 1.拷贝构造 2.赋值重载 } ------取地址重载{ 1.普通对象 2.const对象取地址 } 注&#xff1a;构造函数的目的是初始…

珠海华发实业股份有限公司副总毛冰清莅临天府锋巢直播产业基地考察调研

3月19日&#xff0c;珠海华发实业股份有限公司副总毛冰清拜访天府锋巢直播产业基地&#xff08;以下简称天府锋巢&#xff09;&#xff0c;由产业招商总负责人姜国东进行接待。 基地建设情况 姜国东负责人介绍到&#xff0c;天府锋巢是由德商产投携手无锋科技于兴隆湖落地的成都…

Tmux 使用笔记

Tmux 是一个终端复用器&#xff08;terminal multiplexer&#xff09;&#xff0c;非常有用&#xff0c;属于常用的开发工具。 本文记录个人使用 Tmux的命令。 1. tmux简介 命令行的典型使用方式是&#xff0c;打开一个终端窗口&#xff0c;连接计算机&#xff0c;在里面输入…

Docker功能简单学习及使用

Docker是什么 Docker是一个快速构建&#xff0c;运行&#xff0c;管理应用的工具 传统基于linux安装程序较为复杂繁琐&#xff0c;使用docker可以快速的进行项目部署和管理 镜像与容器 Docker进行安装应用时&#xff0c;会自动搜索并下载应用镜像(image)。镜像不仅包含应用本…

每日一题 — 最大连续 1 的个数III

解法一&#xff1a;暴力枚举 先定义left和right双指针&#xff0c;left先固定在起始位置&#xff0c;遍历right当值等于1的时候&#xff0c;直接跳过&#xff0c;等于0的时候&#xff0c;zero计数器加一当zero等于k的时候&#xff0c;就开始记录此时最大长度是多少然后left加一…

Severt基本使用

severt是让我们自己写一些类,然后把这些类给加载Tomcat中&#xff0c;后续Tomcat收到HTTP请求(来自于浏览器)&#xff0c;就会执行到咱们上面写的代码.从而通过这些代码,完成一定的业务逻辑. 创建项目 此处创建的是一种新的项目的形式称为Maven项目,Maven是Java 中的一个的构建…

【Leetcode每日一题】模拟 - 数青蛙(难度⭐⭐)(51)

1. 题目解析 题目链接&#xff1a;1419. 数青蛙 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 一、模拟青蛙叫声的基本逻辑 在模拟青蛙叫声的过程中&#xff0c;我们需要遵循一定的规则来判断何时青蛙会发出声音。…

每日一题(leetcode2529):正整数和负整数的最大计数--二分法

因为需要O&#xff08;logn&#xff09;的复杂度&#xff0c;所以考虑使用二分法&#xff0c;先找到负数里面的最大下标&#xff08;初始值定为-1&#xff09;&#xff0c;再找到第一个正数的下标&#xff08;初始值定为数组长度值&#xff09;。最后求出个数并进行比较即可。 …