[樱花]题解
题目背景
又到了一年樱花盛开的时节。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。
输出格式
输出一行一个整数表示正整数解的组数模 的值。
分析
首先,我们来看一下这个等式
先通分化简一下
然后,配一下方
然后对比一下下面的等式
可以发现,只要找到满足条件的A和B,就必会有满足条件的x和y。
于是,这道题就可以转换为
可以分解为几个A·B的+形式。
进一步可以转换为
中包含几个质数。
中质因子p的个数就等于1-n中每个数包含的质因数个数之和。在1-n中,p的倍数有n/p个。
的倍数有
个
综上所述,题解就出来了
题解
#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)