取模运算:a % p(或a mod p),表示a除以p的余数。
比如给定一个正整数p,任意一个整数n,一定存在等式 :n = kp + r ;其中 k、r 是整数,且 0 ≤ r < p,则称 k 为 n 除以 p 的商,r 为 n 除以 p 的余数。
取模运算的规则如下:
1、(a + b) % p = (a % p + b % p) % p
2、(a - b) % p = (a % p - b % p) % p
3、(a * b) % p = (a % p * b % p) % p
4、a ^ b % p = ((a % p)^b) % p
先来看看题目
T219307 【模板】快速幂||取余运算
算法
显然暴力是不合适的,因为数据太大
先提供代码
#include<stdio.h>
typedef long long ll; //typedef 用来给数据类型换一个名字
ll PowerMode (ll a,ll b,ll mode); //返回类型long long
int main()
{
ll a,b,mode;
scanf("%lld %lld %lld",&a,&b,&mode);
printf("%lld^%lld mod %lld=%lld\n",a,b,mode,PowerMode(a,b,mode));
}
ll PowerMode (ll a,ll b,ll mode)
{
ll sum=1;
a%=mode; //第一步,先取余
while(b) //指数为0循环停止
{
if(b%2==1) //奇数时,先乘一个a
{
sum=(sum*a)%mode;
}
b/=2; //反正都要减半
a=a*a%mode; //a就要平方(再取余)
}
return sum;
}
思路推演
b&1 b为奇数时,b的二进制末尾为1,此时b和1的与运算为1;b为偶数时,b的二进制末尾为0,此时和1的与运算为0,这个适合用if判断b是否为奇数
#include<stdio.h>
typedef long long ll; //typedef 用来给数据类型换一个名字
ll PowerMode (ll a,ll b,ll mode); //返回类型long long
int main()
{
ll a,b,mode;
scanf("%lld %lld %lld",&a,&b,&mode);
printf("%lld^%lld mod %lld=%lld\n",a,b,mode,PowerMode(a,b,mode));
}
ll PowerMode (ll a,ll b,ll mode)
{
ll sum=1;
a%=mode; //第一步,先取余
while(b) //指数为0循环停止
{
if(b&1) //b为奇数
{
sum=(sum*a)%mode;
}
b/=2; //反正都要减半
a=a*a%mode; //a就要平方(再取余)
}
return sum;
}
如果可以,点个赞吧