<—点个赞吧QwQ
宣传一下算法提高课整理
给定一个整数 n,求有多少正整数数对 (x,y) 满足 1x+1y=1n!。
输入格式
一个整数 n。
输出格式
一个整数,表示满足条件的数对数量。
答案对 109+7 取模。
数据范围
1≤n≤106
输入样例:
2
输出样例:
3
样例解释
共有三个数对 (x,y) 满足条件,分别是 (3,6),(4,4),(6,3)。
思路
这个需要推式子。
首先,根据我们已知的小学数学,可以得出x,y>n!
不妨设y=n!+k
1x+1n!+k=1n!
将两边同分得:
n!×(n!+k)+n!×x=x×(n!+k)
整理得:
x=(n!)2k+n!
∵
\therefore k|{(n!)^2}
所以就变成了求{(n!)}^2的约数个数了。
即n!的每个约数个数\times 2。
所以就要用到阶乘分解了。
然后。。。然后就没有然后了。
代码
#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 1000010,MOD = 1e9 + 7;
int n;
int primes[N],cnt;
bool is_prime[N];
void get_primes (int n) {
memset (is_prime,true,sizeof (is_prime));
is_prime[1] = false;
for (int i = 2;i <= n;i++) {
if (is_prime[i]) primes[++cnt] = i;
for (int j = 1;primes[j] * i <= n;j++) {
is_prime[primes[j] * i] = false;
if (i % primes[j] == 0) break;
}
}
}
int main () {
cin >> n;
get_primes (n);
LL ans = 1;
for (int i = 2;i <= n;i++) {
if (!is_prime[i]) continue;
LL res = 0;
for (LL j = i;j <= n;j *= i) res += n / j;
ans = ans * (res * 2 + 1) % MOD;
}
cout << ans << endl;
return 0;
}
orzsto %%%%%%%%%%%%