刷题时想了半天没想起来。。。。在这里记一下。。免得以后忘记。。。还是求大佬们勿喷。。。。
#include<stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
long long int a,b,c,d=1,e=1,f;//d为答案,e为当前乘方时底数
scanf("%lld%lld%lld",&b,&a,&c);//输入处理数,乘方几次,用多大数求余
f=a;//备份乘方数
e=b;//备份处理数(最初底数)
while(a)//当处理数为0时停止
{
if(a%2==0)//若a为偶数,则b^a和b^2(a/2)相等
{
a/=2;//处理a
e=(e*e)%c;// 底数变化
}
else//若a为奇数,则b^a和 b^2^((a-1)/2)*b相等
{
a/=2;//继续处理,因为除法本身去余的原因,所以不需要减一
e=(e*e)%c;//底数变化
d=(d*e)%c;//答案上被分离出来的那个数。。。突然觉的有点那个是wzy(单身)的感觉。。。。
}
}
printf("%lld^%lld mod %lld=%lld",b,f,c,d);//求出答案,这里给向我一样脑袋不会拐弯的耿直boy解释一下为什么直接出来答案了,当a=1时,while还在循环,所以会d直接乘上e。
}//对了,去膜的问题。。。。加减乘都可以结合律,唯独除不可以。。。好像是。。。暂且记下来。。怕以后忘了