为什么改了这个就能A了???
查看原帖
为什么改了这个就能A了???
220824
yyz1005楼主2023/2/13 16:57

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;
}

这两份代码有区别吗 :]

2023/2/13 16:57
加载中...