84 pts:
#include<bits/stdc++.h>
using namespace std;
//a^b mod m
typedef long long ll;
ll a,m;
ll phm;
ll phi(ll x){
if(m==1) return 1;
ll res = x;
for(ll i = 2; i*i <= x; i++){
if(x%i!=0) continue;
while(x%i==0){
x/=i;
}
res = res/i*(i-1);
}
if(x!=1) res = res/x*(x-1);
return res;
}
ll Fpow(ll k){
if(k==0) return 1;
if(k==1) return a%m;
ll res = 1;
while(k){
if(k&1) res = res*a%m;
a = a*a%m;
k>>=1;
}
return res;
}
int main(){
ll k = 0;
scanf("%lld%lld",&a,&m);
phm = phi(m);
char c;
c = getchar();
while(!isdigit(c)) c = getchar();
while(isdigit(c)){
k = k*10+c-'0';
if(k>phm*2) k-=phm;//这一行
c = getchar();
}
//a^k%m
printf("%lld\n",Fpow(k));
return 0;
}
100 pts
#include<bits/stdc++.h>
using namespace std;
//a^b mod m
typedef long long ll;
ll a,m;
ll phm;
ll phi(ll x){
if(m==1) return 1;
ll res = x;
for(ll i = 2; i*i <= x; i++){
if(x%i!=0) continue;
while(x%i==0){
x/=i;
}
res = res/i*(i-1);
}
if(x!=1) res = res/x*(x-1);
return res;
}
ll Fpow(ll k){
if(k==0) return 1;
if(k==1) return a%m;
ll res = 1;
while(k){
if(k&1) res = res*a%m;
a = a*a%m;
k>>=1;
}
return res;
}
int main(){
ll k = 0;
scanf("%lld%lld",&a,&m);
phm = phi(m);
char c;
c = getchar();
while(!isdigit(c)) c = getchar();
while(isdigit(c)){
k = k*10+c-'0';
if(k>=phm) k = k%phm+phm;//改成了这个
c = getchar();
}
//a^k%m
printf("%lld\n",Fpow(k));
return 0;
}
这两份代码有区别吗 :]