51nod 1106 质数检测(miller rabin 素数测试.)

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 收藏
 关注
给出N个正整数,检测每个数是否为质数。如果是,输出"Yes",否则输出"No"。
 
Input
第1行:一个数N,表示正整数的数量。(1 <= N <= 1000)
第2 - N + 1行:每行1个数(2 <= S[i] <= 10^9)
Output
输出共N行,每行为 Yes 或 No。
Input示例
5
2
3
4
5
6
Output示例
Yes
Yes
No
Yes
No

miller rabin 素数测试...
 1 /*************************************************************************
 2     > File Name: code/51nod/1106.cpp
 3     > Author: 111qqz
 4     > Email: rkz2013@126.com 
 5     > Created Time: 2015年10月19日 星期一 18时51分06秒
 6  ************************************************************************/
 7 
 8 #include<iostream>
 9 #include<iomanip>
10 #include<cstdio>
11 #include<algorithm>
12 #include<cmath>
13 #include<cstring>
14 #include<string>
15 #include<map>
16 #include<set>
17 #include<queue>
18 #include<vector>
19 #include<stack>
20 #include<cctype>
21                  
22 #define yn hez111qqz
23 #define j1 cute111qqz
24 #define ms(a,x) memset(a,x,sizeof(a))
25 using namespace std;
26 const int dx4[4]={1,0,0,-1};
27 const int dy4[4]={0,-1,1,0};
28 typedef long long LL;
29 typedef double DB;
30 const int inf = 0x3f3f3f3f;
31 
32 bool witness(LL a,LL n)
33  {
34     LL t,d,x;
35  d=1;
36  int i=ceil(log(n-1.0)/log(2.0)) - 1;
37  for(;i>=0;i--)
38  {
39  x=d; d=(d*d)%n;
40  if(d==1 && x!=1 && x!=n-1) return true;
41  if( ((n-1) & (1<<i)) > 0)
42  d=(d*a)%n;
43  }
44  return d==1? false : true;
45  }
46 bool miller_rabin(LL n)
47  {
48  if(n==2) return true;
49  if(n==1 || ((n&1)==0)) return false;
50  for(int i=0;i<50;i++){
51  LL a=rand()*(n-2)/RAND_MAX +1;
52  if(witness(a, n)) return false;
53  }
54  return true;
55  }
56 int main()
57  {
58      
59  int n,cnt;
60  LL a;
61  while(scanf("%d",&n)!=EOF)
62  {
63  cnt=0;
64  while(n--)
65  {
66  scanf("%lld",&a);
67  if(miller_rabin(a))
68  puts("Yes");
69  else 
70      puts("No");
71  }
72 // printf("%d
",cnt);
73  }
74  return 0;
75  }
View Code
原文地址:https://www.cnblogs.com/111qqz/p/4892758.html