题意:定义v(n)是不超过n的最大素数, u(n)是大于n的最小素数。
以分数形式"p/q"输出 sigma(i = 2 to n) (1 / (v(i)*u(i))), pq为互质整数且q > 0。
题解:可以把素数看成端点
那么问题就变成了区间求和
假设一段区间的左边是p1 右边是p2
那么这段区间的和就是(p2-p1)/(p2*p1)=1/p1-1/p2
所以答案就是 1/p1-1/p2+1/p2-1/p3....+1/(p(k-1))-1/pk+(n-p(k+1))/(pk*p(k+1))
1/2-1/pk+(n-pk+1)/(pk*(pk+1))
也就是(pk*p(k+1)-2*p(k+1)+2*(n-pk+1))/(2*pk*p(k+1))
再求个gcd就行了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
bool check(ll t){
for(ll i=2;i*i<=t;i++){
if(t%i==0)return 0;
}
return 1;
}
int main(){
ll t,n;
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
ll a,b,i;
for(i=n;;i--){
if(check(i)){
a=i;
break;
}
}
for(i=n+1;;i++){
if(check(i)){
b=i;
break;
}
}
ll k=__gcd(a*b-2*b+2*(n-a+1),2*a*b);
printf("%lld/%lld\n",(a*b-2*b+2*(n-a+1))/k,2*a*b/k);
}
return 0;
}