题目大意:给出一个n,ans = ∑(2≤i≤n)1/(v(i)*u(i)), v(i)为不大于i的最大素数,u(i)为大于i的最小素数, 求ans,输出以分式形式。
思路:可知1/(a*b)=(1/a-1/b)*(1/(b-a)),假设a<b,那么改写式子发现前一部分的1/(a*b)的数量刚好有b-a个,那么单独求出后半部分即可。
ans=1/2-1/v(n)+(n-v(n)+1)/(v(n)*u(n))
#include <cstdio>
bool isp(long long n)
{
for(long long i=2;i*i<=n;i++) if(n%i==0)
return false;
return true;
}
long long gcd(long long a,long long b)
{
long long r=1;
while(r){
r=a%b;
a=b;b=r;
}
return a;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
long long n;
scanf("%I64d",&n);
long long l=n,h=n+1;
while(!isp(l)) l--;
while(!isp(h)) h++;
long long fz=l*h+2*(n-l-h+1);
long long fm=2*l*h;
long long t=gcd(fz,fm);
printf("%I64d/%I64d\n",fz/t,fm/t);
}
return 0;
}