题目大意&&思路:快速幂取模,没看题RE了2次,因为指数为0的情况,囧。。还是用自己的模板,虽然有点繁琐,但是自己的更顺眼嘛~~~
AC program:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cstdlib>
using namespace std;
__int64 test,mod,n;
__int64 a[50000],k[50000];
__int64 fn(__int64 aa,__int64 kk)
{
if(kk==0)return 1;
if(kk==1)return aa%mod;
__int64 tmp=fn(aa,kk/2);
__int64 tmppp=tmp*tmp%mod;
if(kk&1)return tmppp*aa%mod;
return tmppp;
}
int main()
{
cin>>test;
while(test--)
{
cin>>mod;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i]>>k[i];
__int64 sum=0;
for(int i=0;i<n;i++)
{
//cout<<"fn(a[i],k[i]) "<<fn(a[i],k[i])<<endl;
sum=(sum%mod+fn(a[i],k[i])%mod )%mod;
}
cout<<sum<<endl;
}
//system("pause");
return 0;}
总结:
1.模取运算的性质
(1)(a+b)%c = ((a%c)+(b%c))%c
(2)(a*b)%c = ((a%c)*b)%c
2.快速幂乘计算a^b
(1)a,b都为正数,将b二进制化
(2)时间复杂度为logb,乘法次数不是最少的
__int64 power = 1;
while(b > 0){
if(b&1) power *= a;
a *= a;
b >>= 1;
}
return power
3.快速模幂(蒙哥马利算法)
__int64Power(int a,int b,int c) //这个做法好
{
//计算(a^b)%c
int digit[32];
int i, k;
__int64 power=1;
i =0;
while(b)
{
digit[i++]= b%2;
b >>=1;
}
for(k = i-1; k >=0; k--)
{
power=(power* power)% c;
if(digit[k]==1)
{
power=(power * a)% c;}
}
return power;
}
4、
int
exp_mod(
int
a,
int
b,
int
n){
int
r=1;
while
(b){
if
(b&1)r=(r*a)%n;
a=(a*a)%n;
b>>=1;
}
return
r;
}