#10194. 「一本通 6.1 练习 1」A 的 B 次方(快速求mod模板)

题目描述题目链接点这里

给出三个整数 a,b,ma,b,ma,b,m,求 abmodm 的值。

【输入格式】

一行三个整数 a,b,ma,b,ma,b,m。

【输出格式】

一个整数,表示 abmodm 的值。

【样例输入】

2 100 1007

【样例输出】

169

数据范围与提示

对于全部数据,1≤a,b,m≤1091\le a,b,m\le 10^91≤a,b,m≤10​9​​。

思路:mod(就是求余数)快速求mod就是将a^b % c,就是 a的b次方mod c,如果我们将a的b次方求出来再mod,首先,a的b次方会超内存,比如说: 3的10000次方就已经超过int和long long的范围,这自然是不行的,所以我们要定义一个函数,来做到一边乘,一边mod。

举个栗子:  3^4%5=1=81%5=1;这个可以理解的吧,这个就属于全部乘起来再mod,但是再大一点的数,就会内存超限

边乘边mod是什么意思呢? 首先我们先将3^4 拆成 3*3*3*3;那么我们可以先让前面两个3先mod5,9%5=4;接下来我们让mod出来的4乘以下一个3再%5,就是第三个3,4*3%5=2; 然后重复这一步,2*3%5=1;

这样下来,不断的用小规模取mod,可以省内存和空间。

代码实现

#include<cstdio>
#include<cstring>
typedef long long ll;
using namespace std;
ll mod(ll a,ll b,ll c)
{
    ll ans=1%c; a=a%c; //初始化,ans其实等于1,防止后面出错 
    while(b>0)
    {
        if(b&1) ans=ans*a%c; //最后返回的是ans,这里就是边乘边mod 
        b=b>>1; a=a*a%c; //平方 
    }
    return ans;
}
int main()
{
    ll a,b,c;
    scanf("%lld%lld%lld",&a,&b,&c);
    ll d=mod(a,b,c);
    printf("%lld",d);//也可以直接输出 printf("%lld\n",mod(a,b,c)); 
    return 0;
}
/*
快速求mod的模版,一定要记住 
*/

这个快速求mod的代码,会经常用到,而且只要是跟平方跟mod有关系的,几乎都会用到,这个可以说是最原始的版本了,这个难度系数大概是2,因为只要理解了边乘边mod,记起来就十分容易。

猜你喜欢

转载自blog.csdn.net/qq_42367531/article/details/82047777
今日推荐