题目地址: cf#232_div2_D
题目大意:u(n)是不超过n的最大素数,v(n)是大于n的最小素数。 然后求一个和。
额,sb了试几个数就会发现就是列项求和。 然后对n是否是素数判断一下就可以了。
注意两个10^9 的数相乘会爆int ,要用long long 存储
代码:
#include<iostream>
#include<cmath>
using namespace std;
int is_prime(long long n)
{
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0) return 0;
}
return 1;
}
long long gcd(long long a,long long b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
int next_prime(int n)
{
for(int i=n+1;;i++)
if(is_prime(i)) return i;
}
int last_prime(int n)
{
for(int i=n; i>1;i--)
{
if(is_prime(i)) return i;
}
return 2;
}
int main()
{
int cas;
cin>>cas;
while (cas--) {
long long n;
cin>>n;
long long up,down;
if(is_prime(n))
{
up=(n-2)*next_prime(n)+2;
down=n*2*next_prime(n);
}
else
{ // 分数的计算 为什么是这样写 草稿纸上推一推就知道了
long long nextprime=next_prime(n);
long long lastprime=last_prime(n);
up=nextprime*lastprime-2*lastprime-2*(nextprime-n-1);
down=2*nextprime*lastprime;
}
long long thegcd=gcd(up,down);
up/=thegcd;
down/=thegcd;
cout<<up<<"/"<<down<<endl;
}
}