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

[蓝桥杯]春晚魔术【算法赛】

目录

输入格式

输出格式

样例输入

样例输出

运行限制

解决思路

代码说明

复杂度分析

问题描述

在蓝桥卫视春晚的直播现场,魔术师小蓝表演了一个红包魔术。只见他拿出了三个红包,里边分别装有 A、B 和 C 个金币。而后,他挥动魔术棒,念动咒语“福禄寿喜财神到~”,对红包里的金币进行 NN 次变换。每次变换,每个红包的金币数量都会变成其他两个红包金币数量的乘积。

例如:

  • 初始金币数量 A=2A=2,B=3B=3,C=5C=5,进行 N=1N=1 次变换后,金币数量变为 1515,1010,66。
  • 初始金币数量 A=1A=1,B=2B=2,C=3C=3,进行 N=2N=2 次变换后,金币数量变为 66,1212,1818。

变换结束后,小蓝得意地问观众:“现在,你们知道三个红包里金币的总乘积是多少吗?” 他飞快地心算了一下,并报出一个数字:“让我来揭晓答案吧!总乘积是…嗯…(不知道算没算对,只知道算得快)”。

作为观众,请你计算 NN 次变换后,三个红包金币数量的总乘积。由于结果可能很大,请输出其对 109+7109+7 取模的结果。

输入格式

第一行包含一个整数 TT (1≤T≤103)(1≤T≤103),表示测试用例的数量。

接下来的 TT 行,每行包含四个整数 AA,BB,CC 和 NN(1≤A,B,C,N≤1091≤A,B,C,N≤109),表示一组数据。

输出格式

对于每组数据,输出一个整数,表示 NN 次变换后三个红包金币数量的总乘积。由于结果可能很大,请输出其对 109+7109+7 取模的结果。

样例输入

2
2 3 5 1
1 2 3 2

样例输出

900
1296

运行限制

语言最大运行时间最大运行内存
C++1s256M
C1s256M
Java2s256M
Python33s256M
PyPy33s256M
Go3s256M
JavaScript3s256M

总通过次数: 342  |  总提交次数: 774  |  通过率: 44.2%

难度: 中等   标签: 欧拉降幂, 快速幂, 思维, 数学

解决思路

  1. 问题分析:每次变换,红包金币数量变为其他两个红包金币数量的乘积。经过数学推导,N次变换后的总乘积为 (𝐴×𝐵×𝐶)2𝑁mod  (109+7)(A×B×C)2Nmod(109+7)。

  2. 关键观察

    • 初始总乘积 𝑆0=𝐴×𝐵×𝐶S0​=A×B×C。

    • 经过N次变换后,总乘积 𝑆𝑁=𝑆02𝑁SN​=S02N​。

  3. 处理大数

    • 使用模 𝑀=109+7M=109+7(质数),其欧拉函数 𝜙(𝑀)=𝑀−1=109+6ϕ(M)=M−1=109+6。

    • 若 𝐴×𝐵×𝐶≡0mod  𝑀A×B×C≡0modM,则结果直接为0(因为后续幂运算仍为0)。

    • 否则,计算指数 2𝑁mod  𝜙(𝑀)2Nmodϕ(M),再计算 𝑆0S0​ 的该指数次幂模 𝑀M。

  4. 高效计算

    • 使用快速幂算法计算模幂,时间复杂度 𝑂(log⁡𝑁)O(logN) 和 𝑂(log⁡exponent)O(logexponent)。

    • 使用 __int128 处理大数乘法中的溢出问题(适用于支持该类型的编译器)。

#include <iostream>
#include <cstdio>
using namespace std;const long long MOD = 1000000007;
const long long PHI = 1000000006;  // MOD-1// 快速幂函数:计算 (base^exp) % mod
long long fast_pow(long long base, long long exp, long long mod) {if (exp == 0) {return 1 % mod;  // 任何数的0次幂为1(模mod)}base %= mod;long long result = 1;while (exp > 0) {if (exp & 1) {result = (result * base) % mod;}base = (base * base) % mod;exp >>= 1;}return result;
}int main() {int T;scanf("%d", &T);while (T--) {long long A, B, C, N;scanf("%lld %lld %lld %lld", &A, &B, &C, &N);// 计算 base = (A * B * C) % MOD,使用 __int128 避免溢出long long a_mod = A % MOD;long long b_mod = B % MOD;long long c_mod = C % MOD;__int128 temp = static_cast<__int128>(a_mod) * b_mod;temp %= MOD;temp = temp * c_mod;temp %= MOD;long long base = static_cast<long long>(temp);// 若 base 为 0,则结果为 0if (base == 0) {printf("0\n");continue;}// 计算指数:exponent = 2^N mod PHIlong long exponent = fast_pow(2, N, PHI);// 计算结果:result = base^exponent mod MODlong long result = fast_pow(base, exponent, MOD);printf("%lld\n", result);}return 0;
}

代码说明

  1. 常量定义

    • MOD = 1000000007:取模基数。

    • PHI = 1000000006:欧拉函数值(MOD - 1)。

  2. 快速幂函数 fast_pow

    • 高效计算 baseexpmod  modbaseexpmodmod。

    • 使用二进制分解将时间复杂度降至 𝑂(log⁡exp)O(logexp)。

  3. 主函数

    • 读取测试用例数 𝑇T。

    • 对每个测试用例:

      • 读取 𝐴,𝐵,𝐶,𝑁A,B,C,N。

      • 计算初始乘积模 𝑀𝑂𝐷MOD(使用 __int128 避免中间结果溢出)。

      • 若初始乘积模 𝑀𝑂𝐷MOD 为 0,则输出 0。

      • 否则,计算指数 2𝑁mod  PHI2NmodPHI,再计算最终结果 baseexponentmod  MODbaseexponentmodMOD。

  4. 输入输出

    • 使用 scanf 和 printf 提高效率。

复杂度分析

  • 时间复杂度:每个测试用例执行两次快速幂运算(一次计算指数,一次计算结果),每次 𝑂(log⁡exponent)O(logexponent)。总时间复杂度 𝑂(𝑇log⁡𝑁)O(TlogN),满足 𝑇≤1000T≤1000 和 𝑁≤109N≤109 的限制。

  • 空间复杂度:𝑂(1)O(1),仅使用常数空间。

http://www.xdnf.cn/news/10377.html

相关文章:

  • Socket编程之TCP套件字
  • 深 入 剖 析 单 链 表:从 原 理 到 实 战 应 用
  • day17 常见聚类算法
  • Linux 库制作与原理
  • DockerFile常用关键字指令
  • 用Slash将链接转为快捷方式
  • 深入理解交叉熵损失函数——全面推演各种形式
  • 学习STC51单片机22(芯片为STC89C52RCRC)
  • Python训练打卡Day38
  • CTFHub-RCE 命令注入-过滤运算符
  • 【Java开发日记】基于 Spring Cloud 的微服务架构分析
  • 训练中常见的运动强度分类
  • 多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现
  • 用 Spring Boot 静态资源映射 vs 用 Nginx 提供静态文件服务总结
  • OldRoll复古胶片相机:穿越时光,定格经典
  • AI 的早期萌芽?用 Swift 演绎约翰·康威的「生命游戏」
  • kafka学习笔记(三、消费者Consumer使用教程——消费性能多线程提升思考)
  • AIGC学习笔记(8)——AI大模型开发工程师
  • [SC]SystemC在CPU/GPU验证中的应用(六)
  • 大语言模型值ollama使用(1)
  • 2.1HarmonyOS NEXT开发工具链进阶:DevEco Studio深度实践
  • Win10 doccano pip安装笔记
  • Redis最佳实践——安全与稳定性保障之连接池管理详解
  • python做题日记(11)
  • Go 语言的 GC 垃圾回收
  • AWTK 嵌入式Linux平台实现多点触控缩放旋转以及触点丢点问题解决
  • 使用VSCode在WSL和Docker中开发
  • 【机器学习】支持向量机
  • 手写HashMap
  • 8086 处理器 Flags 标志位全解析:CPU 的 “晴雨表” 与 “遥控器”总结: