题目: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; }