logo AlgoBeat OnlineJudge
登录 注册

Official Editorial

作者: 035966_L3  ·  发布于 2026-06-14 20:44:32  ·  最后修改于 2026-06-14 20:54:49
已通过
审核员:joe_zxq 彩笔 · 2026-06-14 20:54:49

https://scg3.piaoztsdy.cn/p/107

首先特判 的情况。

很明显,当 时,,因此答案不可能大于

为质数时,由威尔逊定理可得:

因此答案一定是

为合数时,由题意可知 ,其中 的最小素因子。

显然 ,并且答案不大于 ,暴力枚举即可。

最终的时间复杂度是

#include <bits/stdc++.h>
using namespace std;
bool prime(int n)
{
	if (n == 1) return false;
	for (int i = 2; i * i <= n; i++)
		if (n % i == 0) return false;
	return true;
}
int solve(int n)
{
	if (n <= 2) return n - 1;
	if (prime(n)) return n - 2;
	long long f = 1;
	int ans = 1;
	for (int i = 2; n % i != 0; i++)
	{
		f = f * i % n;
		if (f == 1) ans = i;
	}
	return ans;
}
int main()
{
	freopen("factorial.in", "r", stdin);
	freopen("factorial.out", "w", stdout);
	int T;
	cin >> T;
	while (T--)
	{
		int n;
		cin >> n;
		cout << solve(n) << endl;
	}
	return 0;
}

暂无评论

登录 后即可评论。