链接:
题目大意:
设:
- (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 imes3}+frac{1}{3 imes5}+frac{1}{3 imes5}+frac{1}{5 imes7}+frac{1}{5 imes7}+cdots+frac{1}{u(n) imes v(n)}
]
我们发现,这几个分式中有几个会是重复的,像是这里有两个 (frac{1}{3 imes5}),和两个 (frac{1}{5 imes7})。而它们的数量就是 (v(i)-u(i))。因为重复的分式相当于是在这个区间 (left[u,v(i) ight)) 里。
由此可得:
[egin{aligned}&frac{1}{2 imes3}+frac{1}{3 imes5}+frac{1}{3 imes5}+frac{1}{5 imes7}+frac{1}{5 imes7}+cdots+frac{1}{u(n) imes v(n)}\=&frac{1}{2 imes3}+frac{5-3}{3 imes5}+frac{7-5}{5 imes7}+cdots+frac{v(n)-u(n)}{u(n) imes v(n)}\=&left(frac{1}{2}-frac{1}{3}
ight)+left(frac{1}{3}-frac{1}{5}
ight)+left(frac{1}{5}-frac{1}{7}
ight)+cdots+left(frac{1}{u(n)}-frac{1}{v(n)}
ight)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
", a / Gcd, b / Gcd);
}
return 0;
}