news 2026/6/12 1:11:57

传染病(快速幂)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
传染病(快速幂)

题目背景

新型病毒正在肆虐洛谷。

题目描述

91-DIVOC 正在广泛传播,珂学家 RyanLi 想要探究 91-DIVOC 的传染系数。

第一天有 a 个人被 91-DIVOC 感染,从第二天起,每个感染者都会向 q 个没有感染的人传播 91-DIVOC,使他们变为感染者。

举个例子,如果第一天有 3 人被感染,每个感染者每天向 2 个人传播病毒,那么第二天会有 3×2 个人被感染。第三天会有 3×2×2 个人被感染 ⋯ 以此类推。

定义传染系数为每天被感染 91-DIVOC 的人数的乘积,RyanLi 需要你求出 k 天内的传染系数。由于这个数很大,你只需要输出它对 722733748 取模的结果。

输入格式

输入一行三个整数k,a,q

输出格式

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

输入输出样例

输入

3 3 2

输出

216

分析可知:

每天感染人数:

  • 第 1 天:a

  • 第 2 天:a × q

  • 第 3 天:a × q × q

  • 第 4 天:a × q × q × q

  • ……

  • 第 k 天:a × q^(k-1)

传染系数 = 把这 k 天的人数全部乘起来

① 一共有多少个 a?

一共 k 天 →a 乘了 k 次

→ a × a × a × … × a =a^k

② 一共有多少个 q?

q 的指数是:0 + 1 + 2 + 3 + … + (k-1)

这是等差数列求和:

和 = k×(k-1) / 2

→ q 的总次数就是这个和

q^( k×(k-1)/2 )

快速幂的理解

假如求2^5

正常计算思维:2x2x2x2x2

快速幂: 2^1 ​ 2^2 ​ 2^4 ​ 2^8

为什么快速幂是这样的?(自我思考,解释可能有误)

那么我们就可以深度思考一下二进制转化为十进制其中的奥妙

任意十进制都可以转化为二进制,并且二进制的进位速度非常快,这里所说的进位就是相当于十进制相加时候的满10进1

2^0--->2^1 进位1 2^1--->2^2 进位2 2^2--->2^3 进位4 ..... ..... 2^(n-1)--->2^n 进位2^(n-1)

所以根据这个特点我们就可以得出快速幂把暴力(O(n))求幂压缩到(O(logn)),专门解决超大指数求模问题,普通小指数两种方法差别不大(快速幂)

这里还有个知识点:我在学习汇编语言的时候,老师说过计算机编程时加法优于乘法(说法粗劣),详细原因如下:

底层开发 / 性能极致优化(手写汇编、内核、嵌入式、算法高频运算)这时候加法(+ 移位)优于原生乘法

执行效率:CPU 乘法指令时钟周期更长、延迟高,高频循环里差距会被放大;把x*n转成移位 + 加法是行业标准优化手法。

代码实现

import java.util.*; public class Test1{ static long mod = 722733748L; //计算a^b%mod static long MOD(long a, long b, long mod){ long res = 1; //存储乘法的结果 a %= mod; while(b>0){ if((b & 1) == 1)res = res*a%mod; //这里利用的是二进制,如果 b 是奇数,就把当前的 a 乘到结果里 a = a*a%mod; // a 变成自己的平方 b >>= 1; //相当于b/2,>> 是二进制右移,计算机算得更快 //b >>=1 等价整数除法b = b/2,位运算本身指令周期略短,是编译器友好写法 } return res; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); long k = sc.nextLong(); long a = sc.nextLong(); long q = sc.nextLong(); //先计算a^k long r = MOD(a, k, mod); //计算指数0+1+2+...+k-1 long s = k*(k-1)/2; //计算q^s long t = MOD(q,s,mod); //最终答案 long result = r*t%mod; System.out.println(result); sc.close(); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 1:11:04

从MPC7455数据手册解读嵌入式处理器电源与散热设计实战

1. 从一份数据手册说起:如何读懂一颗“老将”的芯在嵌入式硬件领域,尤其是工业控制、通信设备和一些对长期稳定性和特定指令集有要求的场景里,我们常常会与一些“经典”的处理器架构重逢。飞思卡尔(Freescale,现为NXP的…

作者头像 李华
网站建设 2026/6/12 1:11:03

MPC850 PowerQUICC通信处理器硬件设计实战指南

1. 项目概述:深入解析MPC850 PowerQUICC这颗通信处理“心脏”在嵌入式通信和网络设备领域,处理器选型往往是决定项目成败的第一步。它不仅要承担通用计算任务,更要高效处理海量的、实时的数据流。十几年前,当我第一次接触飞思卡尔…

作者头像 李华
网站建设 2026/6/12 1:09:58

2026微信视频号视频保存到手机相册方法,视频号视频无法直接下载怎么办

日常刷微信视频号时,总会遇到喜欢的内容想要留存到手机相册,方便后续反复观看、整理素材。2026 年依旧有不少用户疑惑微信视频号视频保存到手机相册的具体操作,同时也常常碰到视频号视频无法直接下载的情况。本篇为个人收藏与学习向的实用教程…

作者头像 李华
网站建设 2026/6/12 1:09:05

避坑指南:筛选靠谱 AI 写作软件,满足继续教育毕业论文写作要求

继续教育毕业论文(成人本科、自考、在职职称)核心痛点鲜明:查重率≤15%、AIGC 疑似率<5%、参考文献真实可溯源、格式严格匹配 GB/T7714 标准,且多数用户缺乏学术写作经验、时间紧张、预算有限。但市面上 AI 写作工具鱼…

作者头像 李华
网站建设 2026/6/12 1:08:58

ESP32+TFT_eSPI库:用DMA双缓冲让你的TFT屏动画丝滑起来(附完整代码)

ESP32TFT_eSPI库:用DMA双缓冲让你的TFT屏动画丝滑起来(附完整代码)当你在ESP32上驱动TFT屏幕显示动态内容时,是否遇到过画面卡顿、帧率低下的困扰?这个问题在显示GIF动画或复杂UI时尤为明显。本文将带你深入探索一种硬…

作者头像 李华
网站建设 2026/6/12 1:08:23

python: Generators Pattern

项目结构:# encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # 描述:Generators Pattern 生成器模式 # Author : geovindu,Geovin Du 涂聚文. # IDE…

作者头像 李华