【CodeForces 396B】On Sum of Fractions
链接:
题目大意:
设:
- \(u(n)\) 是不超过 \(n\) 的最大素数。
- \(v(n)\) 是大于 \(n\) 的最小素数。
给定一个 \(n\),求出 \(\sum_{i=2}^{n}\frac{1}{u(i)v(i)}\)。
正文:
我们尝试拆开原式:
\[\sum_{i=2}^{n}\frac{1}{u(i)v(i)}=\frac{1}{2\times3}+\frac{1}{3\times5}+\frac{1}{3\times5}+\frac{1}{5\times7}+\frac{1}{5\times7}+\cdots+\frac{1}{u(n)\times v(n)}
\]
我们发现,这几个分式中有几个会是重复的,像是这里有两个 \(\frac{1}{3\times5}\),和两个 \(\frac{1}{5\times7}\)。而它们的数量就是 \(v(i)-u(i)\)。因为重复的分式相当于是在这个区间 \(\left[u,v(i)\right)\) 里。
由此可得:
\[\begin{aligned}&\frac{1}{2\times3}+\frac{1}{3\times5}+\frac{1}{3\times5}+\frac{1}{5\times7}+\frac{1}{5\times7}+\cdots+\frac{1}{u(n)\times v(n)}\\=&\frac{1}{2\times3}+\frac{5-3}{3\times5}+\frac{7-5}{5\times7}+\cdots+\frac{v(n)-u(n)}{u(n)\times v(n)}\\=&\left(\frac{1}{2}-\frac{1}{3}\right)+\left(\frac{1}{3}-\frac{1}{5}\right)+\left(\frac{1}{5}-\frac{1}{7}\right)+\cdots+\left(\frac{1}{u(n)}-\frac{1}{v(n)}\right)\end{aligned}
\]
到这里,你会发现式子里面可以消掉一些分式,只剩下 \(\frac{1}{2}-\frac{1}{v(n)}\)。
我爱裂项题。
代码:
int t;
ll n;
inline bool isPri(ll x)
{
for (ll i = 2; i * i <= x; i ++)
if(x % i == 0) return 0;
return 1;
}
ll gcd (ll a, ll b) {return b? gcd (b, a % b): a;}
int main()
{
for (scanf ("%d", &t); t--; )
{
scanf ("%lld", &n);
bool flagu = 0, flagv = 0;
ll u = n + 1, v = n;
for (flagu = isPri(u), flagv = isPri(v); !flagu || !flagv; )
{
if(!flagu) u++, flagu = isPri(u);
if(!flagv) v--, flagv = isPri(v);
}
ll a = v * u - 2 * u + 2 * n - 2 * v + 2,
b = 2 * u * v,
Gcd = gcd(a, b);
printf ("%lld/%lld\n", a / Gcd, b / Gcd);
}
return 0;
}