当前位置: 首页 > news >正文

传染病(快速幂)

题目背景

新型病毒正在肆虐洛谷。

题目描述

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(); } }
http://www.gsyq.cn/news/1507417.html

相关文章:

  • MPC7441硬件设计实战:从电源时序到PCB布局的避坑指南
  • 本科论文答辩难吗?
  • 计算机毕业设计之基于大数据技术的音乐专辑数据可视化系统
  • 终极指南:掌握洛雪音乐助手的10个高效技巧,打造完美音乐体验 [特殊字符]
  • MPC755硬件设计:信号完整性、上拉配置与热管理实践
  • 强化学习在视觉推理与图像隐喻理解中的革新应用
  • 【课程设计/毕业设计】基于SpringBoot的婚纱影楼服务平台设计和实现摄影师管理、套餐类型管理、婚纱套餐管理、套餐预定管理、拍摄预约管理【附源码、数据库、万字文档】
  • Spring Boot 3.2 升级踩坑实录:从 2.7 迁移过来,这几个兼容性问题花了我一周
  • 深入解析PowerPC MPC7447A:七级流水线、AltiVec向量单元与硬件设计实战
  • 2026 无锡五大正规猫犬舍测评:伴西西登顶,定义行业靠谱新标准 - 同城宠物优选基地
  • OpenLayers 6 动态流动线效果实战:从静态GeoJSON到‘活’地图的保姆级教程
  • AI教材编写新利器!低查重AI写教材工具,快速产出高质量教材书稿!
  • 用App Inventor 2给娃做个接水果游戏:从素材上传到随机掉落逻辑的保姆级教程
  • 发现新多晶型吲哚美辛
  • Keep企业级AIOps告警管理平台架构深度解析与生产部署指南
  • AI动态简报之技术前沿篇(2026.06.11)
  • redis和数据库实现分布式锁
  • AI教材生成大突破!掌握这些技巧,低查重教材轻松搞定!
  • Spring Cloud LoadBalancer自定义策略全解析:从源码模仿到四种实战策略(含网关路由)
  • Better Exceptions:Python异常调试的革命性可视化解决方案
  • 手把手教你用Python脚本调试ZDT_Emm42_V5.0步进电机驱动器(Modbus-RTU协议)
  • MC9S08SH8 TPM模块深度解析:从输入捕获到PWM的实战指南
  • 保姆级教程:用STM32 HAL库驱动W25N01GV Nand Flash(含ECC校验与坏块管理思路)
  • AI动态简报之算力基建篇(2026.06.11)
  • 揭秘20KV脉冲电弧:磁场下的形态之谜与直流/交流放电辨析
  • 关于C语言中getchar()的详细使用
  • 2026 贵阳五大犬舍专业测评:伴西西登顶,综合实力断层领先 - 同城宠物优选基地
  • 24小时健身加盟选哪个品牌更合适 - 品牌排行榜
  • 2026 泉州犬舍 TOP5 权威榜单,伴西西断层领跑,以标准化体系重塑行业标杆 - 同城宠物优选基地
  • C语言项目实战:用uthash给你的自定义数据结构加个‘高速缓存’