2018/7/31-zznu-oj- 2128: 素数检测 -【费马小定理裸应用】

2128: 素数检测

时间限制: 1 Sec  内存限制: 128 MB
提交: 84  解决: 32
[提交] [状态] [讨论版] [命题人:admin]

题目描述

在算法竞赛中你会遇到各种各样的有关素数的问题,今天你来解决一个最基础的问题:如何判定一个素数。
对于给定的正整数p,若p非素数,输出-1
若p是素数 输出 :{sigma(a^(p-1) % p) ,其中a的下界为1,上界为p-1}
即:

输入

多实例测试,每组数据包含一个正整数p(p < 10^16)。 

输出

根据情况输出一个正整数,保证答案在int64之内,输出占一行。 

样例输入

2

样例输出

1

提示

若一个数有99.9755%以上的概率为素数,你便可以认为这个数字为素数。
 

 

大致思路:

   利用费马小定理,其内容为: 假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p),例如:假如a是整数,p是质数,则a,p显然互质(即两者只有一个公约数1);

       那么我们可以得到费马小定理的一个特例,即当p为质数时候, a^(p-1)≡1(mod p), 这个公式意思就是:a^(p-1) 和1 同时对p 取模的结果是一致的!!!

                                                                                                                                                                                                                                     ——百度百科

代码:

  
 1 #include <iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<string>
 5 #include<algorithm>
 6 #define ll long long
 7 using namespace std;
 8 #include<math.h>
 9 #define N 1008
10 #define M 100008
11 using namespace std;
12 #define ll long long
13 int prime(ll n){
14     for(int i=2;i<=(int)sqrt(1.0*n) ;i++){
15         if(n%i==0)
16             return 1;
17     }
18     return 0;
19 }
20 int main()
21 {
22     ll T;
23 
24     while(scanf("%lld", &T)!=EOF)
25     {
26         if(prime(T)==1)
27             printf("-1\n");
28         else
29             printf("%lld\n", T-1);
30     }
31 
32     return 0;
33 }
View Code

 

 
 
 
 
 
posted @ 2018-08-01 16:38  山枫叶纷飞  阅读(316)  评论(0编辑  收藏  举报