首先特判 n2n \le 2 的情况。

很明显,当 xnx \ge n 时,nx!n\mid x!,因此答案不可能大于 n1n-1

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

(n1)!1 (mod n)(n-1)! \equiv -1\ (\bmod\ n) (n1)!n1 (mod n)(n-1)! \equiv n-1\ (\bmod\ n) (n2)!1 (mod n)(n-2)! \equiv 1\ (\bmod\ n)

因此答案一定是 n2n-2

nn 为合数时,由题意可知 px!p\nmid x!,其中 ppnn 的最小素因子。

显然 pnp \le \sqrt{n},并且答案不大于 p1p-1,暴力枚举即可。

最终的时间复杂度是 O(Tn)O(T\sqrt{n})

#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;
}