思路:
直接枚举n,然后用双模数去判断
c o d e code code
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const ll MAXN = 3e5 + 10, p1 = 1e9 + 7, p2 = 998244353;
string s;
ll len, tota, totb;
ll a[MAXN], b[MAXN], c[MAXN], d[MAXN];
ll qpow(ll x, ll k) {
ll ans = 1;
for(; k; k >>= 1, x = x * x % p1) if(k & 1) ans = ans * x % p1;
return ans % p1;
}
ll qpow_(ll x, ll k) {
ll ans = 1;
for(; k; k >>= 1, x = x * x % p2) if(k & 1) ans = ans * x % p2;
return ans % p2;
}
ll chu() {
for(ll i = 0; i < len; i ++) c[300000 - i] = s[len - i - 1] - '0';
ll g = 0;
for(ll i = 1; i <= 300000; i ++) {
g = g * 10 + c[i];
g = g % p2;
}
return g % p2;
}
ll chu_() {
for(ll i = 0; i < len; i ++) d[300000 - i] = s[len - i - 1] - '0';
ll g = 0;
for(ll i = 1; i <= 300000; i ++) {
g = g * 10 + d[i];
g = g % p1;
}
return g % p1;
}
int main() {
for(int i = 1; i <= 50000; i ++)
a[i] = qpow_(i, i), b[i] = qpow(i, i);
cin>>s;
len = s.size();
ll r = chu(), r2 = chu_();
for(ll i = 1; i <= 300000; i ++)
if(a[i] == r && b[i] == r2) {
printf("%lld", i);
return 0;
}
return 0;
}