题目链接:传送门
分析:
1/n! = 1/x +1/y
==> n! * (x + y) = x * y
==> n!^2 = (x - n!)*(y - n!)
==> a = b * c ,a = n!^2 ,b = x - n! ,c = y - n!
因此题目就转化成求a的约数的问题了,然后对a进行素
因子分解就可以了,统计的时候记得去重。
代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1e6+10;
const int mod = 1e9+7;
typedef long long LL;
int prime[maxn],cnt;
bool vis[maxn];
void init() {
cnt = 0;
memset(vis,0,sizeof(vis));
for(int i=2; i<maxn; i++) {
if(!vis[i]) {
prime[cnt++]=i;
for(int j=i+i; j<maxn; j+=i)
vis[j]=1;
}
}
}
LL calu(int n,int p) {
if(n<p) return 0;
else return calu(n/p,p) + n/p;
}
LL quick_mod(LL a,LL b){
LL ans = 1;
while(b){
if(b&1) ans=ans*a%mod;
b>>=1;
a=a*a%mod;
}
return ans ;
}
int main() {
init();
int n;
while(~scanf("%d",&n)) {
LL ans = 1;
LL m = quick_mod(2LL,(LL)mod-2);
for(int i=0; i<cnt&&prime[i]<=n; i++) {
LL tmp = (calu(n,prime[i])*2+1)%mod;
ans=ans*tmp%mod;
}
ans = ans*m%mod;
ans = (ans+1*m%mod)%mod;
printf("%lld\n",ans);
}
return 0;
}