1 条题解

  • 1
    @ 2025-2-3 14:33:13

    首先特判 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;
    }
    
    • 1

    信息

    ID
    144
    时间
    1000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    15
    已通过
    3
    上传者