题解
这个时候,需要枚举方程式的右边,把结果存储一下,
之后枚举方程式的左边,观察有没有对应的右边,记录最小值即可。
代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e7+55;
bool vis[maxn];
ll dis[maxn];
ll qpow(ll a, ll b, ll p) {
ll ret = 1;
while (b) {
if (b & 1) ret = (ret * a) % p;
b >>= 1;
a = (a * a) % p;
}
return ret;
}
int main() {
ll p, n, m;
while (cin >> p) {
for (int i = 0; i <= p; ++ i) {
vis[i] = false;
}
ll pow3 = qpow(3ll, p-2, p);
// cout << pow3 << endl;
ll ret = 1;
for (int i = 1; i <= p; ++ i) {
ret *= pow3;
ret %= p;
if (!vis[ret]) {
// cout << ret << endl;
vis[ret] = true;
dis[ret] = i;
}
}
bool flag = false;
ret = 1ll;
for (int i = 0; i <= p; ++ i) {
if (vis[ret]) {
ll nn = i, mm = dis[ret];
if (!flag) {
flag = true;
n = nn, m = mm;
}
if (nn+mm < n+m) {
n = nn, m = mm;
}
if (nn+mm == n+m && n < nn) {
n = nn, m = mm;
}
}
ret *= 2ll;
ret %= p;
}
cout << n << " " << m << endl;
}
return 0;
} 
京公网安备 11010502036488号