cf D. On Sum of Fractions
http://codeforces.com/problemset/problem/397/D
题意:v(n) 表示小于等于n的最大素数,u(n)表示比n的大的第一个素数,然后求出;
思路:把分数拆分成两个分数相减,你就会发现规律,等于1/2-1/3+1/3-1/5.。。。。。。。,找出v(n)和u(n),答案就出来了。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define ll long long 5 using namespace std; 6 7 int t; 8 ll n; 9 10 ll gcd(ll a,ll b) 11 { 12 return b==0?a:gcd(b,a%b); 13 } 14 15 int main() 16 { 17 scanf("%d",&t); 18 while(t--) 19 { 20 scanf("%lld",&n); 21 ll l,r; 22 bool flag=true; 23 for(int i=2; i*i<=n; i++) 24 { 25 if(n%i==0) 26 { 27 flag=false; 28 break; 29 } 30 } 31 if(flag) 32 { 33 r=n+1; 34 while(r) 35 { 36 int f1=1; 37 for(int i=2; i*i<=r; i++) 38 { 39 if(r%i==0) 40 { 41 f1=0; 42 break; 43 } 44 } 45 if(f1) 46 { 47 break; 48 } 49 r++; 50 } 51 ll cc=2*n*r; 52 ll xx=n*r-2*(r-1); 53 ll g=gcd(xx,cc); 54 printf("%lld/%lld\n",xx/g,cc/g); 55 } 56 else 57 { 58 l=n-1; 59 while(l) 60 { 61 int f2=1; 62 for(int i=2; i*i<=l; i++) 63 { 64 if(l%i==0) 65 { 66 f2=0; 67 break; 68 } 69 } 70 if(f2) 71 { 72 break; 73 } 74 l--; 75 } 76 r=n+1; 77 while(r) 78 { 79 int f3=1; 80 for(int i=2; i*i<=r; i++) 81 { 82 if(r%i==0) 83 { 84 f3=0; 85 break; 86 } 87 } 88 if(f3) 89 { 90 break; 91 } 92 r++; 93 94 } 95 ll c1=2*l*r; 96 ll x1=l*r-2*(l+r-n-1); 97 ll gg=gcd(x1,c1); 98 printf("%lld/%lld\n",x1/gg,c1/gg); 99 } 100 } 101 return 0; 102 }