CF396B. On Sum of Fractions
1 /* 2 cf396B. On Sum of Fractions 3 http://codeforces.com/problemset/problem/396/B 4 数论+裂项求和+素数筛+gcd 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cmath> 9 using namespace std; 10 const int Nmax=1000001; 11 int n; 12 int prime[Nmax]; 13 int is_prime[Nmax]; 14 int prime_cnt; 15 long long a,b; 16 long long gcd(long long x,long long y) 17 { 18 if(x%y==0) 19 return y; 20 else 21 return gcd(y,x%y); 22 } 23 void get_prime() 24 { 25 for(int i=2;i<=Nmax-1;i++) 26 is_prime[i]=1; 27 for(int i=2;i<=Nmax-1;i++) 28 { 29 if(is_prime[i]) 30 { 31 prime[++prime_cnt]=i; 32 for(int j=2;j*i<=Nmax-1;j++) 33 { 34 is_prime[i*j]=0; 35 } 36 } 37 } 38 } 39 void get() 40 { 41 int flag; 42 for(int i=n;i>=2;i--) 43 { 44 if(i<=Nmax-1)//i在素数表内直接判断 45 { 46 if(!is_prime[i]) 47 continue; 48 else 49 { 50 a=i; 51 break; 52 } 53 } 54 for(int j=1;j<=prime_cnt;j++)//否则枚举判断 55 { 56 flag=1; 57 if(i%prime[j]==0) 58 { 59 flag=0; 60 break; 61 } 62 } 63 if(flag) 64 { 65 a=i; 66 break; 67 } 68 } 69 for(int i=n+1;;i++) 70 { 71 if(i<=Nmax-1) 72 { 73 if(!is_prime[i]) 74 continue; 75 else 76 { 77 b=i; 78 break; 79 } 80 } 81 for(int j=1;j<=prime_cnt;j++) 82 { 83 flag=1; 84 if(i%prime[j]==0) 85 { 86 flag=0; 87 break; 88 } 89 } 90 if(flag) 91 { 92 b=i; 93 break; 94 } 95 } 96 } 97 int main() 98 { 99 //freopen("cf396B.in","r",stdin); 100 int t; 101 scanf("%d",&t); 102 get_prime();//素数筛 打出Nmax内的素数表 103 while(t--) 104 { 105 scanf("%d",&n); 106 get();//得到不超过n的素数a和大于n的素数b 107 long long p=a*b-2*b+2*n-2*a+2,q=2*a*b; 108 //约分 109 long long gcdd=gcd(p,q); 110 p=p/gcdd; 111 q=q/gcdd; 112 printf("%I64d/%I64d\n",p,q); 113 } 114 return 0; 115 }