题意:T组测试数据,每组数据一个N, 求 (N-1)!%p ?
思路:威尔逊定理:当且仅当p为素数时:( p - 1)! ≡ -1 ( mod p ),但是4的时候是个例外,
(4-1)!≡ 2(mod 4)。
素数判定用朴素的比较慢,可以用Miller_Rabbin测试判素。
#include<bits/stdc++.h>
using namespace std;
bool isprime(int n)
{
if (n == 1) return false;
if (n == 2) return true;
int m = sqrt(n);
for (int i = 2; i <= m; i++)
{
if (n%i == 0) return false;
}
return true;
}
int main()
{
int T, n; scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
if (n == 4) { printf("2\n"); continue; }
if (isprime(n)) printf("%d\n", n-1);
else printf("0\n");
}
return 0;
}
/*
2
3
10
*/