P1226 【模板】快速幂||取余运算

博客围绕P1226快速幂取余运算模板展开,介绍了题目描述、输入输出格式与样例。还给出了取余运算的多个公式,如(a + b) % p = (a % p + b % p) % p等,以及重要定理,如若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p)等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

P1226 【模板】快速幂||取余运算

题目描述

输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。

输入输出格式

输入格式:

三个整数b,p,k.

输出格式:

输出“b^p mod k=s”

s为运算结果

输入输出样例

输入样例#1:

2 10 9

输出样例#1:

2^10 mod 9=7
TIPS:
原理:将某个数字多次自乘化为它的若干次幂的少次相乘,从而减少计算量,提高效率。转化的方法如下:将指数写成二进制之后,从右到左,如果为0则跳过,如果为1则乘底数的2的(位数-1)次幂,如:100^10D = 100^1010B= 100^10B * 100 ^ 1000B=100^2D * 100^8D。另外计算数字较大,所以要取余运算。取余运算有几个重要的性质需要使用:

(括号的余等于括号中每项分别取余再取余)

  1. (a + b) % p = (a % p + b % p) % p (1)
  2. (a - b) % p = (a % p - b % p) % p (2)
  3. (a * b) % p = (a % p * b % p) % p (3)*使用在快速幂中
  4. a ^ b % p = ((a % p)^b) % p (4)
  • 结合律:
    ((a+b) % p + c) % p = (a + (b+c) % p) % p (5)
((a*b) % p * c)% p = (a * (b*c) % p) % p (6)
  • 交换律:
    (a + b) % p = (b+a) % p (7)
(a * b) % p = (b * a) % p (8)
  • 分配律:
    (a+b) % p = ( a % p + b % p ) % p (9)
    ((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p (10)

重要定理

  • 若a≡b (% p),则对于任意的c,都有(a + c) ≡ (b + c) (%p);(11)
  • 若a≡b (% p),则对于任意的c,都有(a * c) ≡ (b * c) (%p);(12)
  • 若a≡b (% p),c≡d (% p),则 (a + c) ≡ (b + d) (%p),(a - c) ≡ (b - d) (%p),
    (a * c) ≡ (b * d) (%p),(a / c) ≡ (b / d) (%p); (13)
#include<cstdio>
#include<iostream>
int main(void){
	long base,b,p,pow,k,s = 1;
	scanf("%ld %ld %ld", &base, &pow, &k);

	b = base;
	p = pow;
	
	while(p){
		if(p&1){
			s = s * b % k; 
			
		}
		b = b * b % k;
		p = p >> 1;
	}

	printf("%ld^%ld mod %ld=%ld\n", base, pow, k, s % k);
	
	return 0; 
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值