求解这道题要先知道这个公式,(a*a)%c=((a%c)*(a%c))%c
然后用降幂法,举例子具体说吧,
3^8=3^4*3^4=(3^2*3^2)(3^2*3^2)=((3*3)(3*3))((3*3)(3*3)),如果要求3^8%5,先求得3%5,
根据公式1就能依次求得3^2%5,3^4%5,3^8%5,这就是一个除2降幂的过程。
要注意的是某一次除2降幂可能幂变成奇数,这时要先拿出一个再降幂,
比如3^10=3^5*3^5(幂为5,是奇数)=(3^2*3^2*3)*(3^2*3^2*3)=……
#include<iostream>
using namespace std;
int main()
{
int n, a, b, c;
long long sum,temp;
cin>>n;
while (n--)
{
cin>>a>>b>>c;
sum=a % c;
temp=1;
while(b>1)
{
if(b%2==1)
{
temp*=sum;
temp%=c;
b--;
}
else
{
sum*=sum;
sum%=c;
b/=2;
}
}
cout<<sum*temp%c<<endl;;
}
return 0;
}
383



被折叠的 条评论
为什么被折叠?



