「解题报告」ARC158D Equation
好神仙的题。
考虑形如
原式要求
那么假如我们有一个
我们可以每次随机
我们可以证明,随机一次成功的概率大于等于
考虑我们要满足的性质:
前者概率为
我们可以证明,
我们设
设
:那么说明 ,由于 ,可以发现不可能等于 ; :说明有三个数 ,且 ,由于 ,且 ,那么有 ,即 ,则 ,即 ,这意味着如果有两个相同的数,和一定不等于 。那么随机选取三个数,两两不相同的概率就是 ; :那么固定 ,假如 ,那么不可能等于 ;否则,选中这个数的概率为 。
综上可知等于
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005, P = 998244353;
int T;
int n, p;
mt19937 rd(chrono::system_clock::now().time_since_epoch().count());
int Rand(int l, int r) {
return uniform_int_distribution<int>(l, r)(rd);
}
long long qpow(int a, long long b) {
int ans = 1;
while (b) {
if (b & 1) ans = 1ll * ans * a % p;
a = 1ll * a * a % p;
b >>= 1;
}
return ans;
}
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &p);
while (true) {
long long a = Rand(1, p - 1), b = Rand(1, p - 1), c = Rand(1, p - 1);
if (a == b || a == c || b == c) continue;
int x = (a + b + c) * (qpow(a, n) + qpow(b, n) + qpow(c, n)) % p * (qpow(a, 2ll * n) + qpow(b, 2ll * n) + qpow(c, 2ll * n)) % p;
int y = (qpow(a, 3ll * n) + qpow(b, 3ll * n) + qpow(c, 3ll * n)) % p;
if (x != 0 && y != 0) {
int t = 1ll * y * qpow(x, p - 2) % p;
vector<long long> ans = { 1ll * a * t % p, 1ll * b * t % p, 1ll * c * t % p };
sort(ans.begin(), ans.end());
printf("%lld %lld %lld\n", ans[0], ans[1], ans[2]);
break;
}
}
}
return 0;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现