幂取模【快速幂】

文章介绍了快速幂算法,这是一种用于高效计算大数次幂的方法,其时间复杂度为O(logN),显著优于朴素的O(N)方法。通过举例和代码展示,解释了快速幂如何通过位运算减少计算次数,包括在模运算环境下的应用。
摘要由CSDN通过智能技术生成

幂取模

题目描述

输入正整数a、n和m,输出 a n a^{n} an m o d mod mod m m m的值。
范围: a , n , m < = 1 0 9 a,n,m<=10^9 a,n,m<=109

输入描述

输入正整数a、n和m

输出描述

输出 a n a^{n} an m o d mod mod m m m

样例

输入

1 2 3

输出

1

解析

这道题明显是一道快速幂的题目,那么要点就来了:
什么是快速幂呢?
顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O O O( log ⁡ 2 N \log_2{N} log2N), 与朴素的 O O O( N N N)相比效率有了极大的提高。
快速幂的实现思想可以用一个例子来说明:

2 100 2^{100} 2100的快速幂
2的100次幂
只要为1的位我们就让它自增一位即可

AC代码

#include<iostream>
#include<cstdio>
using namespace std;
//快速幂函数(含题目的取余)
long long qpow(long long a, long long n, long long m) {
	long long ans = 1;
	while (n) {
		//如果二进制位为1则自增
		if (n % 2 == 1) {
			ans = (ans * a) % m;
		}
		a = (a * a) % m;  //a自增
		n >>= 1;  //n除以2(位运算)
	}
	return ans;
}
//朴素的主函数
int main() {
	long long a, n, m;
	scanf("%lld%lld%lld", &a, &n, &m);
	long long ans = qpow(a, n, m);
	printf("%lld", ans);
	return 0;
}

附:快速幂函数

long long qpow(long long a, long long n) {
	long long ans = 1;
	while (n) {
		if (n % 2 == 1) {
			ans *= a;
		}
		a *= a;
		n >>= 1;
	}
	return ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值