樱花
Posted onlyblues
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了樱花相关的知识,希望对你有一定的参考价值。
樱花
给定一个整数 $n$,求有多少正整数数对 $(x,y)$ 满足 $\\frac1x+\\frac1y=\\frac1n!$。
输入格式
一个整数 $n$。
输出格式
一个整数,表示满足条件的数对数量。
答案对 $10^9+7$ 取模。
数据范围
$ 1 \\leq n \\leq 10^6$
输入样例:
2
输出样例:
3
样例解释
共有三个数对 $(x,y)$ 满足条件,分别是 $(3,6)$,$(4,4)$,$(6,3)$。
解题思路
\\beginalign*
\\frac1x + \\frac1y &= \\frac1n! \\\\\\\\
\\fracx+yxy &= \\frac1n! \\\\\\\\
x \\cdot n! + y \\cdot n! &= x \\cdot y
\\endalign*
可以发现有两个自变量,因此可以通过枚举来固定$x$然后通过$x$与$y$的关系来得到满足条件的$y$。其中$y$关于$x$的函数为$y = \\dfracx \\cdot n!x - n!$。
现在问题就变成了有多少个正整数$x$使得$\\dfracx \\cdot n!x - n!$是一个正整数。由于分子分母同时含有$x$不方便处理,因此把分子的$x$去掉。$$y = \\dfracx \\cdot n!x - n! = \\frac(x - n! + n!) \\cdot n!x - n! = n! + \\frac(n!)^2x - n!$$
由于$n!$必然是一个正整数,因此问题又变成了有多少个正整数$x$使得$\\dfrac(n!)^2x - n!$是一个正整数。$x$一定正整数,但分母的$x - n!$不一定是正整数,事实上根据$\\frac1x+\\frac1y=\\frac1n!$得到$\\frac1y=\\frac1n! - \\frac1x$,由于$x$和$y$均要满足正整数的条件,因此$x$必然要满足$x > n!$,因此$x - n! > 0$。因此问题就等价于有多少个正整数$x$使得$x - n!$是$(n!)^2$的约数,等价于就是问$(n!)^2$的约数个数。其中如果一个数$N = P_1^\\alpha_1 \\cdot P_2^\\alpha_2 \\cdot \\cdots \\cdot P_n^\\alpha_n$,那么约数的个数为$\\left( \\alpha_1 + 1 \\right) \\cdot \\left( \\alpha_2 + 1 \\right) \\cdot \\cdots \\cdot \\left( \\alpha_n + 1 \\right)$。
AC代码如下:
#include <bits/stdc++.h> using namespace std; const int N = 1e6 + 10, mod = 1e9 + 7; int primes[N], cnt; bool vis[N]; void get_prime(int n) for (int i = 2; i <= n; i++) if (!vis[i]) primes[cnt++] = i; for (int j = 0; primes[j] <= n / i; j++) vis[primes[j] * i] = true; if (i % primes[j] == 0) break; int main() int n; scanf("%d", &n); get_prime(n); int ret = 1; for (int i = 0; i < cnt; i++) int p = primes[i], s = 0; for (int j = n; j; j /= p) s += j / p; ret = ret * (2ll * s + 1) % mod; printf("%d", ret); return 0;
参考资料
AcWing 1294. 樱花(算法提高课):https://www.acwing.com/video/691/
以上是关于樱花的主要内容,如果未能解决你的问题,请参考以下文章