【题目描述】题目链接点这里
给出三个整数 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≤109。
思路: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,记起来就十分容易。