根据题意推式子。。
,然后通分,
,之后打开合并,
,
之后移项
设
所以
那么
因为x为整数,而一定为整数,所以要求后面的为整数,也就是有多少n的阶乘的平方的约数,就有多少解。
所以可以对1~n分解质因数,根据约数和公式,就是n的质因数的指数+1的乘积。
所以把1~n每个质因数的指数求和,平方就相当于个数*2,最后根据公式求乘积即可。
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define mode 1000000007
using namespace std;
typedef long long ll;
int n,pri[1000006],used[1000006],cnt,ans[1000006];
ll as=1;
void gett()
{
for(int i=2;i*i<=n;i++)
{
if(!used[i])pri[++cnt]=i;
for(int j=1;j<=cnt&&(ll)i*(ll)pri[j]*(ll)i*(ll)pri[j]<=(ll)n;j++)
{
used[i*pri[j]]=1;
if(i%pri[j]==0)continue;
}
}
}
void findf(int x)
{
for(int i=1;i<=cnt&&pri[i]*pri[i]<=x;i++)
{
while(x%pri[i]==0)
{
ans[pri[i]]++;
x/=pri[i];
}
}
if(x>1)
{
ans[x]++;
}
}
int main()
{
scanf("%d",&n);
gett();
for(int i=1;i<=n;i++)findf(i);
for(int i=1;i<=n;i++)
{
as=as*(2*ans[i]+1)%mode;
}
printf("%lld",as);
return 0;
}