Description

1/N! = 1/X + 1/Y(0 < x<=y),给出N,求满足条件的整数解的数量。例如:N = 2,1/2 = 1/3 + 1/6,1/2 = 1/4 + 1/4。由于数量可能很大,输出Mod 10^9 + 7。

Solution

看到式子,直接考虑把式子简化,一般规律就是把等式两边全部变成乘号。
1n!=1x+1y
1n!=x+yxy
(x+y)n!=xy
xy−xn!−yn!=0
两边同时加上(n!)2
(x−n!)(y−n!)=(n!)2
那么现在就可以变成ab=c的形式
那么方案数就是c的(约数个数+1)/2(因为c2是一个平方数)

Code

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
typedef long long ll;
using namespace std;
const int maxn=1e6+7,mo=1e9+7;
ll i,j,k,l,t,n,m,ans;
ll p[maxn],ni2;
bool bz[maxn];
int main(){
fo(i,2,1000000){
if(!bz[i])p[++p[0]]=i;
fo(j,1,p[0]){
t=p[j]*i;
if(t>1000000)break;
bz[t]=1;
if(i%p[j]==0)break;
}
}
scanf("%lld",&n);
ans=1;
fo(i,1,p[0]){
if(p[i]>n)break;
t=p[i];l=0;
while(t<=n){
l+=n/t;
t=t*p[i];
}
l=l*2+1;
ans=ans*l%mo;
}
ans++;
ni2=500000004;
ans=ans*ni2%mo;
printf("%lld\n",ans);
}