**
快速幂取模算法介绍
**
首先说一下快速幂算法(快速计算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;
}