Leasier
2023-03-14 20:06:41
下面
首先是赛时想法:
现在我们来考虑如何不随机化。
考虑钦定
考虑在无解时改
首先给出结论:
证明:首先,失败只可能有两种情况
对于第二种情况,由于
对于第一种情况,考虑在失败时分类讨论
于是有
于是有
于是有
综上,把
代码:
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll ans[7];
inline ll quick_pow(ll x, ll p, ll mod){
ll ans = 1;
while (p){
if (p & 1) ans = ans * x % mod;
x = x * x % mod;
p >>= 1;
}
return ans;
}
inline bool check(){
sort(ans + 1, ans + 4);
return ans[1] != ans[2] && ans[2] != ans[3];
}
int main(){
int t;
cin >> t;
for (int i = 1; i <= t; i++){
int n, p;
cin >> n >> p;
n %= p - 1;
if (n % 2 == 0){
if (p == 5 || p == 11){
for (int j = 2; ; j++){
ans[1] = (quick_pow(j, (ll)n * 3, p) * 2 % p + 1) % p * quick_pow((quick_pow(j, n, p) * 2 % p + 1) % p * (quick_pow(j, n * 2, p) * 2 % p + 1) % p, p - 2, p) % p;
ans[2] = ans[1] * j % p;
ans[3] = p - ans[2];
if (check()) break;
}
} else {
ll r = 2;
do {
ans[1] = (quick_pow(r, (ll)n * 3, p) * 2 % p + 1) % p * quick_pow((quick_pow(r, n, p) * 2 % p + 1) % p * (quick_pow(r, n * 2, p) * 2 % p + 1) % p, p - 2, p) % p;
ans[2] = ans[1] * r % p;
ans[3] = p - ans[2];
r = r * r % p;
} while (!check());
}
} else {
ans[1] = quick_pow((quick_pow(2, n * 2, p) * 2 % p + 1) % p, p - 2, p);
if (ans[1] == 0){
ans[1] = quick_pow((quick_pow(4, n * 2, p) * 2 % p + 1) % p, p - 2, p);
ans[2] = ans[1] * 4 % p;
} else {
ans[2] = ans[1] * 2 % p;
}
ans[3] = p - ans[2];
check();
}
for (int j = 1; j <= 3; j++){
cout << ans[j] << " ";
}
cout << endl;
}
return 0;
}