题解 - ARC172E
题目链接
讲一种比较暴力的做法。
写一个暴力随便尝试几个数,容易发现对于一个数
具体证明可以看这里。
而我们发现题目中刚好保证了
于是可以直接预处理出
全部跑满大概是
具体代码实现非常的简单。
#include <iostream>
using namespace std;
const int MOD = 1e9;
typedef long long ll;
const int M = 1e6, K = 1e3;
ll qpow(ll x, int k){
ll res = 1;
for(; k; k >>= 1, x = x * x % MOD)
if(k & 1) res = res * x % MOD;
return res;
}
ll q, x;
int v[M+50];
int main(){
for(int i = 1; i <= M; ++i){
int val = qpow(i, i);
v[val % M] = i;
}
for(cin >> q; q--; ){
cin >> x;
int pre = v[x%M];
for(int j = 0; j < K; ++j){
int nxt = j * M + pre;
if(qpow(nxt, nxt) == x){
cout << nxt << "\n";
break;
}
}
}
}