题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2721
可以知道 x 和 y 一定都大于 n! ,不妨把 y 表示为 n!+t ;
那么 1/x + 1/y = 1/x + 1/(n!+t) = 1/n! ;
整理一下,最终变成:x = (n!)²/t + 1 ;
于是问题转化为求有多少个 t 让 x 是整数,也就是 (n!)² 的约数个数;
用质因数分解求,筛素数什么的......
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int const maxn=1e6+5; int n,pri[maxn],mn[maxn],cnt[maxn],ct; long long ans,mod=1e9+7; void init() {mn[1]=1;// for(int i=1;i<=n;i++){if(!mn[i])pri[++ct]=i,mn[i]=i;for(int j=1;j<=ct&&i*pri[j]<=n;j++){mn[i*pri[j]]=pri[j];if(i%pri[j]==0)break;}} } void cal(int x) {while(x!=1){cnt[mn[x]]++;x/=mn[x];} } int main() {scanf("%d",&n);init();while(n)cal(n),n--;ans=1;for(int i=1;i<=ct;i++)(ans*=(2*cnt[pri[i]]+1))%=mod;printf("%lld",ans);return 0; }