2128: 素数检测
时间限制: 1 Sec 内存限制: 128 MB提交: 84 解决: 32
[提交] [状态] [讨论版] [命题人:admin]
题目描述
在算法竞赛中你会遇到各种各样的有关素数的问题,今天你来解决一个最基础的问题:如何判定一个素数。
对于给定的正整数p,若p非素数,输出-1
若p是素数 输出 :{sigma(a^(p-1) % p) ,其中a的下界为1,上界为p-1}
即:
对于给定的正整数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 "); 28 else 29 printf("%lld ", T-1); 30 } 31 32 return 0; 33 }