社区讨论
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 条回复,欢迎继续交流。
正在加载回复...