hdu 5391 (威爾遜定理 數論)
阿新 • • 發佈:2018-12-12
題意很清楚,求(n-1)! mod n 。
由威爾遜定理可知,若n是素數,ans為n-1。
考慮n是合數的情況,只有當n=4時,ans=2,其它情況ans都是0,即前n-1個數中一定包含了n的所有因子。
估算一下複雜度,有1e5個數據,n最大為1e9。若用素數篩預處理會T。所以我們只能考慮用sqrt(n)複雜度的演算法判斷n是否是素數,儘管看上去總複雜度也超過了1e9。但實際上只有當n是素數時,單步判斷n的複雜度才會是sqrt(n),而素數往往是很少的。且大部分合數都有一個比較小的因子,所以大部分合數在迴圈幾十次可能就能判斷出它的性質。
這種做法的複雜度無法準確算出來,但是的確是可以AC的。
#include<bits/stdc++.h> using namespace std; bool isprime(int n) { for(int i=2; i<=sqrt(n); 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"); else { if(isprime(n)) printf("%d\n",n-1); else { printf("0\n"); } } } }