洛谷 [樱花] 题解

[樱花]题解

题目背景

又到了一年樱花盛开的时节。Vani 和妹子一起去看樱花的时候,找到了一棵大大的樱花树,上面开满了粉红色的樱花。Vani 粗略估计了一下,一共有足足 n!n! 片花瓣。

Vani 轻柔地对她说:“你知道吗?这里面的一片花瓣代表着你,我从里面随机摘一片,能和你相遇的概率只有 1/n!1/n! 那么小。我该是多么的幸运,才让你今天这么近地站在我面前。相信我,我一定会把这亿万分之一的缘分变为永远。”

粉红的樱花漫天飞舞,妹子瞬间被 Vani 感动了。她轻轻地牵起了他的手,和他相依而坐。这时,她突然看到田野的尽头也长着两棵樱花树,于是慢慢地把头靠在 Vani 的肩上,在他耳边低语:“看到夕阳里的那两棵樱花树了吗?其中一棵树上的一片花瓣是你,另一棵树上的一片花瓣是我,如果有人从这棵摘下一片,从那棵采下一瓣,我们相遇的概率会不会正好是 1/n!1/n! 呢?”

Vani 的大脑飞速运作了一下,立即算出了答案。正要告诉妹子,她突然又轻轻地说:“以前你总是说我数学不好,但是这种简单的题我还是会算的。你看假如左边那棵树上有 xx 片花瓣,右边那个有 yy 片花瓣,那么我们相遇的概率不就是 1/x+1/y1/x+1/y 么,不过有多少种情况能使它正好可以等于 1/n!1/n! 呢?这个你就帮我算一下吧~”

显然,面对天然呆的可爱妹子,Vani 不但不能吐槽她的渣数学,而且还要老老实实地 帮她算出答案哦。

题目描述

在这里插入图片描述

输入格式

输入只有一行一个整数,表示 n。

输出格式

输出一行一个整数表示正整数解的组数模 1 0 9 + 7 10^9+7 的值。

分析

首先,我们来看一下这个等式

1 x + 1 y = 1 n ! \frac{1}{x}+\frac{1}{y}=\frac{1}{n!}

先通分化简一下

y + x = x y n ! y + x=\frac{xy}{n!}

然后,配一下方

n ! 2 n ! ( x + y ) + x y = n ! 2 n!^2-n!(x+y)+xy=n!^2

( x n ! ) ( y n ! ) = n ! 2 (x-n!)(y-n!)=n!^2

然后对比一下下面的等式

A B = n ! 2 A·B=n!^2

可以发现,只要找到满足条件的A和B,就必会有满足条件的x和y。
于是,这道题就可以转换为 n ! 2 n!^2 可以分解为几个A·B的+形式。
进一步可以转换为 n ! 2 n!^2 中包含几个质数。
n ! 2 n!^2 中质因子p的个数就等于1-n中每个数包含的质因数个数之和。在1-n中,p的倍数有n/p个。 p 2 p^2 的倍数有 n / p 2 n/p^2
综上所述,题解就出来了

题解
#include <cstdio>
#define ll long long
const ll MAXN = 1e6 + 5, MOD = 1e9 + 7;
bool v[MAXN];
ll pr[MAXN];
ll n, ans = 1, cnt;
void Primes() {
	ll i, j;
	for(i = 2; i <= n; i++) {
		if(v[i])
			continue;
		pr[++cnt] = i;
		for(j = i; j <= n / i; j++)
			v[i * j] = 1;
	}
}
int main() {
	ll i, j;
	scanf("%lld", &n);
	Primes();
	for(i = 1; i <= cnt; i++) {
		ll k = 0;
		for(j = pr[i]; j <= n; j *= pr[i])
			k += n / j;
		ans *= (k * 2 + 1) % MOD;
		ans %= MOD;
	}
	printf("%lld", ans % MOD);
	return 0;
}

(注意:要开long long)

猜你喜欢

转载自blog.csdn.net/Face_the_Blast/article/details/107622042