AcWing 89 a^b 快速幂取模

本文详细介绍了快速幂算法及快速幂取模算法的原理与实现,通过实例展示了如何高效计算大数的幂次方并进行取模运算,适用于解决数据范围较大的编程问题。

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

**

快速幂取模算法介绍

**
首先说一下快速幂算法(快速计算a^b)

    当b为奇数时a^b=a× (a×a) × (a×a) × (a×a) × (a×a) × (a×a) × (a×a) × (a×a) × (a×a)
                =a×  ((a×a) × (a×a))   ×   ((a×a) × (a×a))  ×  ((a×a) × (a×a))  ×  ((a×a) × (a×a))
                =a×  ( ((a×a)×(a×a)) × ((a×a)×(a×a)) )  ×  ( ((a×a)×(a×a)) × ((a×a)×(a×a)) )
    当b为偶数时a^b=(a×a) × (a×a) × (a×a) × (a×a) × (a×a) × (a×a) × (a×a) × (a×a)
                =((a×a) × (a×a))   ×   ((a×a) × (a×a))  ×  ((a×a) × (a×a))  ×  ((a×a) × (a×a))
                =( ((a×a)×(a×a)) × ((a×a)×(a×a)) )  ×  ( ((a×a)×(a×a)) × ((a×a)×(a×a)) )
    简单举个例子2^9=2*4*4*4*4=2*16*16
              2^8=4*4*4*4=16*16
              2^7=2*4*4*4=2*4^3=2*4*16
              2^6=4^3=4*16
int ksm(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b%2==1)  //判断b的奇偶
            ans*=a;
        a*=a;
        b/=2;
    }
    return ans;
}

接下来说一下快速幂取模算法(快速计算a^b%p)
利用 (a×b) mod p = [(a mod p)×(b mod p)] mod p 可直接把快速幂转换为快速幂取模

    当b为奇数时(a^b)%p=[a%p× (a×a)%p× (a×a)%p× (a×a)%p× (a×a)%p× (a×a)%p × (a×a)%p × (a×a)%p × (a×a)%p]%p
    当b为偶数时a^b=[(a×a)%p × (a×a)%p × (a×a)%p × (a×a)%p × (a×a)%p × (a×a)%p × (a×a)%p × (a×a)%p]%p
    (括号实在是太多,所以就只写了一行式子,懂意思就好)

代码

int ksmqm(int a,int b,int p)   //数据类型依题而定
{  
    int ans=1;
    while(b>1)  
    {  
        if((b&1)!=0)   //判断b的奇偶
            ans=(ans*a)%p;  
        a=(a*a)%p;  
        b/=2;      
    }  
    return (ans*a)%m;      
} 

例题
题目
求 a的b次方对p取模的值。
输入格式
三个整数
a,b,p在同一行用空格隔开。
输出格式
输出一个整数,表示a^b mod p的值。
数据范围
1≤a,b,p≤10^9
输入样例:
3 2 7
输出样例:
2

#include <stdio.h>
int main()
{
	long long a,b,p,ans=1;
	scanf("%lld%lld%lld",&a,&b,&p);
	while(b>1)
	{
		if(b&1!=0)
		   ans=(ans*a)%p;
		a=(a*a)%p;
		b/=2;
	}
	if(a==0) printf("0\n");
	else if(b==0) printf("%lld\n",1%p);
	else printf("%lld\n",(ans*a)%p);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值