[ARC158D] Equation

题意

给定整数 \(n\) 以及模数 \(p\)

你需要构造三元组 \((x, y, z)\) 满足:

  • \(1 \le x < y < z \le p - 1\)
  • \((x + y + z)(x ^ n + y ^ n + z ^ n)(x ^ {2n} + y ^ {2n} + z ^ {2n}) \bmod x ^ {3n} + y ^ {3n} + z ^ {3n} (mod p)\)

Sol

注意到你如果将左边的式子化简过后,一定是一堆系数乘一堆 \(x, y, z\) 的次方。

发现一个问题,如果我们设当前左边的值与右边的值的比为 \(t\)

那么一定有一组答案为 \(frac{x}{y}, frac{y}{t}, frac{z}{t}\)

\(p\) 为质数,所以只需要左右不为 \(0\) 就可以了。

yy一下感觉这个限制非常松,随便随几组就能对。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#include <random>
#define int long long
using namespace std;
#ifdef ONLINE_JUDGE

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
	int p = 0, flg = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') flg = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		p = p * 10 + c - '0';
		c = getchar();
	}
	return p * flg;
}
void write(int x) {
	if (x < 0) {
		x = -x;
		putchar('-');
	}
	if (x > 9) {
		write(x / 10);
	}
	putchar(x % 10 + '0');
}

int pow_(int x, int k, int p) {
	int ans = 1;
	while (k) {
		if (k & 1) ans = ans * x % p;
		x = x * x % p;
		k >>= 1;
	}
	return ans;
}
mt19937 rnd(147744151);

void solve() {
	int n = read(), mod = read();
	bool flg = 1;
	while (flg) {
		int x = rnd() % mod, y = rnd() % mod, z = rnd() % mod;
		int tp0 = ((x + y + z) * (pow_(x, n, mod) + pow_(y, n, mod) + pow_(z, n, mod)) % mod * (pow_(x, 2 * n, mod) + pow_(y, 2 * n, mod) + pow_(z, 2 * n, mod)) % mod) % mod, tp1 = (pow_(x, 3 * n, mod) + pow_(y, 3 * n, mod) + pow_(z, 3 * n, mod)) % mod;
		/* write(x), putchar(32); */
		/* write(y), putchar(32); */
		/* write(z), puts("@"); */
		if (x == y || y == z || x == z || !x || !y || !z || !tp0 || !tp1) continue;
		flg = 0;
		int t = tp1 * pow_(tp0, mod - 2, mod) % mod;
		x = x * t % mod, y = y * t % mod, z = z * t % mod;
		if (x > y) swap(x, y);
		if (y > z) swap(y, z);
		if (x > y) swap(x, y);
		write(x), putchar(32);
		write(y), putchar(32);
		write(z), puts("");
		flg = 0;
	}
}
signed main() {
	int T = read();
	while (T--) solve();
	return 0;
}
posted @ 2024-01-18 16:44  cxqghzj  阅读(14)  评论(0编辑  收藏  举报