莫欺少年穷,修魔之旅在这开始—>算法提高课题解
结论: 求解 (n!)2 的约数个数
证明:
令 y=n!+k
则1x+1y=1n!⇒1x+1n!+k=1n!⇒x=(n!)2k+n!
因为 x 和 n! 是整数,所以 (n!)2k 也为整数,即求 (n!)2 的约数个数
假设 n!=pa11⋅pa22⋅…⋅pakk,那么 (n!)2=p2a11⋅p2a22⋅…⋅p2akk
则 (n!)2 的约数个数:(2a1+1)(2a2+1)…(2ak+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;
}