Zball in Tina Town(数论规律题+特判+较大数判是否为素数的正确姿势)

来源:互联网 发布:java 类写成api 编辑:程序博客网 时间:2024/05/22 16:21


Link:http://acm.hdu.edu.cn/showproblem.php?pid=5391

Zball in Tina Town

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 138    Accepted Submission(s): 98


Problem Description
Tina Town is a friendly place. People there care about each other.

Tina has a ball called zball. Zball is magic. It grows larger every day. On the first day, it becomes 1 time as large as its original size. On the second day,it will become 2 times as large as the size on the first day. On the n-th day,it will become n times as large as the size on the (n-1)-th day. Tina want to know its size on the (n-1)-th day modulo n.
 

Input
The first line of input contains an integer T, representing the number of cases.

The following T lines, each line contains an integer n, according to the description.
T105,2n109
 

Output
For each test case, output an integer representing the answer.
 

Sample Input
2310
 

Sample Output
20
 

Source
BestCoder Round #51 (div.2)
 


官方题解:


这题就是求 (n-1)!modn(n1)!  mod  n

如果nn为合数,显然答案为0.

如果nn为素数,那么由威尔逊定理可得答案为 n-1n1

注意有个trick为 nn = 4

注意:输入的n比较大,要先打素数表再判是否为素数才不会TLE!!!

AC code:

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>#include<math.h>#include<vector>#include<map>#include<set>#include<cmath>#include<string>#include<algorithm>#include<iostream>#define LL long long #define MAXN 1000010using namespace std;const int INF=0x3f3f3f3f;const int N = 100005;const int MOD = 9901;LL n,ans;bool prime[N];int p[N];//保存素数 int cnt;void isprime()//素数筛选 {    cnt = 0;    memset(prime,true,sizeof(prime));    for(int i=2; i<N; i++)    {        if(prime[i])        {            p[cnt++] = i;            for(int j=i+i; j<N; j+=i)                prime[j] = false;        }    }}bool Judge(LL A)//判断是否为素数,是素数则返回true {    for(int i=0; p[i]*p[i] <= A; i++)    {        if(A % p[i] == 0)        {            return false;        }    }    return true;}int main(){    //freopen("D:\in.txt","r",stdin);    int t;    isprime();    scanf("%d",&t);    while(t--)    {        scanf("%I64d",&n);        if(n==4)//特判 {printf("2\n"); }         else if(!Judge(n))        {            printf("0\n");        }        else        {            printf("%I64d\n",n-1);        }    }    return 0;}


0 0