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
",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
",x1/gg,c1/gg);
 99         }
100     }
101     return 0;
102 }
View Code
原文地址:https://www.cnblogs.com/fanminghui/p/4258925.html