社区讨论

34分且MLE

P5091【模板】扩展欧拉定理参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mke1ezm4
此快照首次捕获于
2026/01/14 21:09
2 个月前
此快照最后确认于
2026/01/17 21:45
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll unsigned long long
ll a,m;
string b;
ll big_mod(const string& s, ll mod) {
    ll res = 0;
    for (char c : s) {
        res = (res * 10 + (c - '0')) % mod;
    }
    return res;
}
bool str_less_than(const string& s, ll num) {
    string num_str = to_string(num);
    if (s.length() != num_str.length()) {
        return s.length() < num_str.length();
    }
    return s < num_str;
}
ll quick_pow(ll base, ll exp, ll mod) {
    ll res = 1 % mod;
    base %= mod;
    while (exp) {
        if (exp & 1) res = (res * base) % mod;
        base = (base * base) % mod;
        exp >>= 1;
    }
    return res;
}
int main(){
    cin>>a>>m>>b;
    vector<ll> phi(m+1);
    vector<ll> primes;
    vector<bool> isprime(m+1,false);
    phi[1]=1;
    for (ll i = 2; i <= m; i++) {
        if (!isprime[i]) {
            primes.push_back(i);
            phi[i] = i - 1;
        }
        for (ll j = 0; j < primes.size(); j++) {
            ll p=primes[j];
            if (i * p > m) break;
            isprime[i * p] = true;
            if (i % p == 0) {
                phi[i * p] = phi[i] * p;
                break;
            } 
            else {
                phi[i * p] = phi[i] * (p - 1);
            }
        }
    }
    ll phim=phi[m],gcd=__gcd(a,m);
    ll b1=0;
    if(gcd==1){
        b1=big_mod(b,phim);
    }else{
        if(gcd!=1&&str_less_than(b,phim)){
            b1=big_mod(b,phim);
        }else{
            b1=big_mod(b,phim)+phim;
        }
    }
    ll ans=quick_pow(a,b1,m);
    cout<<ans<<endl;
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...