题意很简单 求n! 的因子的因子的个数
首先对于任意一个数字 他的因子的个数等于将这个数字分解质因数后 每个质因数的次数加1 的乘积
我们将n!进行质因数分解之后 对于某个质因数p 假设他的最高次数为a 那么我们可以选择0次 1次2次3...... a次 对于每次选择 他的因子的个数就可以为次数加一 那么总的贡献就是 1+2+3+4+......+a+1= (a+1)*(a+2)/2;
那么所有的质因数的总贡献乘积就是答案 也就是
代码实现如下:
cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e7+7;
const int N=1e6+5;
int qpow(int a,int b){
int ans=1;
for(;b;b>>=1){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
}
return ans;
}
vector<int>minp(N,0),primes;
void sieve(int n){
minp.assign(n+1,0);
primes.clear();
for(int i=2;i<=n;i++){
if(!minp[i]){
minp[i]=i;
primes.push_back(i);
}
for(auto p:primes){
if(i*p>n)break;
minp[i*p]=p;
if(p==minp[i])break;
}
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
sieve(N-4);
int n;
while(cin>>n&&n!=0){
int ans=1;
for(auto p:primes){
if(p>n)break;
int cnt=0;
for(int j=n;j;j/=p)cnt+=j/p;
ans=(ans*(cnt+1)%mod*(cnt+2)%mod)%mod *5000004%mod;
}
cout<<ans<<'\n';
}
return 0;
}