莫欺少年穷,修魔之旅在这开始—>算法提高课题解
结论: $求解\ (n!)^2\ 的约数个数$
证明:
令$\ y=n!+k$
$则\dfrac{1}{x}+\dfrac{1}{y}=\dfrac{1}{n!}\Rightarrow \dfrac{1}{x}+\dfrac{1}{n!+k}=\dfrac{1}{n!}\Rightarrow x=\dfrac{(n!)^2}{k}+n!$
$因为\ x\ 和\ n!\ 是整数,所以\ \dfrac{(n!)^2}{k}\ 也为整数,即求\ (n!)^2\ 的约数个数$
$假设\ n!=p_1^{a_1}\cdot p_2^{a_2}\cdot …\cdot p_k^{a_k},那么\ (n!)^2=p_1^{2a_1}\cdot p_2^{2a_2}\cdot …\cdot p_k^{2a_k}$
$则\ (n!)^2\ 的约数个数:(2a_1+1)(2a_2+1)…(2a_k+1)$
n! 中质数 p 的个数可参考: 阶乘分解
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1000010, mod = 1e9 + 7;
int n;
int primes[N],cnt;
bool st[N];
//线性筛
void init(int n)
{
for(int i=2;i<=n;i++)
{
if(!st[i]) primes[cnt++]=i;
for(int j=0;primes[j]<=n/i;j++)
{
st[primes[j]*i]=true;
if(i%primes[j]==0) break;
}
}
}
int main()
{
cin>>n;
init(n);
int res=1;
for(int i=0;i<cnt;i++)
{
int p=primes[i],s=0;
//统计 n! 中质数 p 的个数
for(int j=n;j;j/=p) s+=j/p;
res=(LL)res*(2*s+1)%mod;
}
cout<<res<<endl;
return 0;
}