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

数学之快速幂-数的幂次

题目描述

给定三个正整数 N,M,P,求

输入描述

第 1 行为一个整数 T,表示测试数据数量。

接下来的 T 行每行包含三个正整数 N,M,P。

输出描述

输出共 T 行,每行包含一个整数,表示答案。

输入输出样例

示例 1

输入

3
2 3 7
4 5 6
5 2 9

 

输出

1
4
7

思想:

快速幂(Fast Exponentiation)是一种用于高效计算大整数幂运算的算法,特别是在计算 时非常有用。它的核心思想是通过分治法二进制分解,将幂运算的时间复杂度从 O(b) 降低到O(logb)。


快速幂的核心思想

  1. 二进制分解

    • 将指数 b 表示为二进制形式。例如,b=13的二进制表示为 1101。

    • 通过二进制分解,可以将  分解为多个 a 的幂的乘积。例如:

      其中,8,4,1是二进制位为 1 的位置对应的幂。

  2. 分治法

    • 通过不断平方 a,可以快速计算出  等幂。

    • 每次平方操作将幂的次数翻倍,从而大大减少计算量。

  3. 模运算优化

    • 在计算过程中,每一步都对结果取模 p,避免数值过大,同时保证结果的正确性。


快速幂的步骤

  1. 初始化结果 res=1。

  2. 检查指数 b 的二进制位:

    • 如果当前二进制位为 1,将当前的 a 乘到结果 res 中,并对 p 取模。

    • 将 a 平方,并对 p 取模,为下一次循环做准备。

    • 将 b 右移一位(相当于 b=b/2),继续处理下一位。

  3. 当 b 变为 0 时,返回结果 res。

解题代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;// 定义一个快速幂函数 qmi,用于计算 a^b % p
ll qmi(ll a, ll b, ll p)
{ll res = 1; // 初始化结果为 1while (b) // 当 b 不为 0 时循环{if (b & 1) // 如果 b 的最低位是 1res = res * a % p; // 将当前的 a 乘到结果中,并取模 pa = a * a % p; // 将 a 平方,并取模 pb >>= 1; // 将 b 右移一位,相当于 b /= 2}return res; // 返回最终结果
}int main()
{int t; // 定义测试用例的数量 tcin >> t; // 输入测试用例的数量for (int i = 1; i <= t; i++) // 循环处理每个测试用例{ll n, m, p; // 定义三个正整数 n, m, pcin >> n >> m >> p; // 输入 n, m, pcout << qmi(n, m, p) << '\n'; // 调用 qmi 函数计算 n^m % p 并输出结果}return 0; // 程序正常结束
}

 

 

 

 

 

 

 

 


http://www.mrgr.cn/news/93910.html

相关文章:

  • el-pagination的使用说明
  • 【解决哈希冲突】
  • vscode带参数调试
  • starrocks如何配置多个hive数据源,其中一个是kerberos认证
  • JavaScript中的生成器函数详解
  • 【CSS3】金丹篇
  • 微信小程序,自定义导航栏,搜索框滚动,搜索框过渡,滚动吸顶,吸顶导航栏,过渡动画,自定义tabbar
  • 【14】单片机编程核心技巧:整除运算与数位提取
  • VSCode 2025最新前端开发必备插件推荐汇总(提效指南)
  • Mac如何查看 IDEA 的日志文件
  • vulnhub靶场【digitalworld.local系列】的electrical靶机
  • OpenManus-通过源码方式本地运行OpenManus,含踩坑及处理方案,chrome.exe位置修改
  • 用python和Pygame库实现“跳过障碍”游戏
  • 从0开始的操作系统手搓教程33:挂载我们的文件系统
  • 若依RuoYi-Cloud-Plus微服务版(完整版)前后端部署
  • c语言笔记 getchar
  • 关于在electron(Nodejs)中使用 Napi 的简单记录
  • 多模态融合的分类、跨模态对齐的方法
  • 练习:关于静态路由,手工汇总,路由黑洞,缺省路由相关
  • vue3 + xlsx 实现导入导出表格,导出动态获取表头和数据