【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;
}
posted @ 2021-01-04 21:40  Jayun  阅读(81)  评论(0编辑  收藏  举报