cf396B On Sum of Fractions

Let's assume that

  • v(n) is the largest prime number, that does not exceed n;
  • u(n) is the smallest prime number strictly greater than n.

Find .

Input

The first line contains integer t (1 ≤ t ≤ 500) — the number of testscases.

Each of the following t lines of the input contains integer n (2 ≤ n ≤ 109).

Output

Print t lines: the i-th of them must contain the answer to the i-th test as an irreducible fraction "p/q", where p, q are integers, q > 0.

Examples
Input
2
2
3
Output
1/6
7/30

                

写写1/v(i)u(i)的前几项就能发现规律

i    2   3   4   5

v   2   3   3   5

u   3   5   5   7

如果用个f(i)表示1/v(i)u(i),那么对于一个质数x,有f(2)+f(3)+...+f(x-1)=1/2-1/x

然后在对于一个夹在两质数a,b之间的x,显然从a到x的f值都是a/b,所以就是找到n前后最近的质数,把两分式通分一下就好了

这里我是直接n往前往后Miller-Robin找第一个质数,不过sqrt(n)的暴力应该也能卡过去?

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<queue>
 8 #include<deque>
 9 #include<set>
10 #include<map>
11 #include<ctime>
12 #define LL long long
13 #define inf 0x7ffffff
14 #define pa pair<int,int>
15 #define mkp(a,b) make_pair(a,b)
16 #define pi 3.1415926535897932384626433832795028841971
17 using namespace std;
18 inline LL read()
19 {
20     LL x=0,f=1;char ch=getchar();
21     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
22     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
23     return x*f;
24 }
25 LL mul(LL x,LL n,LL MOD)
26 {
27     LL res=x*n-(LL)((long double) x*n/MOD+0.5)*MOD;
28     while (res<0)res+=MOD;
29     while (res>=MOD)res-=MOD;
30     return res;
31 }
32 LL qpow(LL x,LL n,LL MOD)
33 {
34     x=(x%MOD+MOD)%MOD;
35     LL p=x,con=1;
36     while (n)
37     {
38         if (n&1)con=mul(con,p,MOD);
39         p=mul(p,p,MOD);
40         n>>=1;
41     }
42     return con;
43 }
44 bool witness(LL a,LL b)
45 {
46     if (a==b)return true;
47     LL s=b-1;
48     int t=0;
49     while (!(s&1))s>>=1,t++;
50     LL x=qpow(a,s,b);
51     if (x==1)return 1;
52     while (t--)
53     {
54         if (x==b-1)return true;
55         x=mul(x,x,b);
56         if (x==1)return false;
57     }
58     return false;
59 }
60 bool isprime(LL x)
61 {
62     if (x==0||x==1)return false;
63     static int p[]={2,3,5,7,11,13,17,19,23,29,31};
64     for (int i=0;i<=10;i++)
65         if (!witness(p[i],x))return false;
66     return true;
67 }
68 inline LL gcd(LL a,LL b)
69 {
70     if (a<b)swap(a,b);
71     return b==0?a:gcd(b,a%b);
72 }
73 int main()
74 {
75     int T=read();
76     while (T--)
77     {
78         LL x=read(),y,z,t,ans1,ans2;
79         for (y=x;y>=2;y--)if (isprime(y))break;
80         for (z=x+1;z<=1e9+7;z++)if (isprime(z))break;
81         //ans=1/2-1/y+(x-y+1)*y/z
82         ans1=y*z-2*z+2*x-2*y+2;ans2=2*y*z;
83         t=gcd(ans1,ans2);ans1/=t;ans2/=t;
84         printf("%lld/%lld
",ans1,ans2);
85     }
86 }
cf396B
原文地址:https://www.cnblogs.com/zhber/p/7283426.html