/
10394.cpp
executable file
·106 lines (55 loc) · 1.6 KB
/
10394.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include<stdio.h>
long primes[1175850],prime_num =10;
long num=1;
void sieve(long L,long U);
int main()
{
//freopen("10394.in","r",stdin);
//freopen("10394.out","w",stdout);
long n,i;
sieve(1,18409873);
//printf("%ld\n",prime_num);
//n=1;
for(i=10;i<prime_num;i++)
{
if(primes[i+1]-primes[i]==2)
{
primes[num++] = primes[i];
//printf("%ld %ld (%ld)\n",primes[i],primes[i+1],n);
//n++;
}
}
while(scanf("%ld",&n)==1)
{
printf("(%ld, %ld)\n",primes[n],(primes[n]+2));
}
return 0;
}
void sieve(long L,long U) {
long i,j,d;
d=U-L+1; /* from range L to U, we have d=U-L+1 numbers. */
/* use flag[i] to mark whether (L+i) is a prime number or not. */
bool *flag=new bool[d];
for (i=0;i<d;i++) flag[i]=true; /* default: mark all to be true */
for (i=(L%2!=0);i<d;i+=2) flag[i]=false; /* mark even numbers as false */
/* sieve by prime factors staring from 3 till sqrt(U) */
for (i=3;i*i<=U;i+=2) {
if (i>L && !flag[i-L]) continue;
/* choose the first number to be sieved -- >=L,
divisible by i, and not i itself! */
j=L/i*i;
if (j<L) j+=i;
if (j==i) j+=i; /* if j is a prime number, have to start form next one */
/* now start sieving */
j-=L; /* change j to the index representing j */
for (;j<d;j+=i) flag[j]=false;
}
/* mark 1 as false, 2 as true */
if (L<=1) flag[1-L]=false;
if (L<=2) flag[2-L]=true;
for (i=0;i<d;i++)
{
if (flag[i])
primes[prime_num++] = L+i;
}
}