题目链接:Divisors of the Divisors of An Integer
我们直接看每个质因子的贡献即可。
假设这个质因子有x个,那么我们构造某一个数的时候可以选0,1,2,3,…,x个,然后对应的因子就有1,2,3,4,5,…,x个。
所以每个因子的贡献就是(x+1)*(x+2)/2
但是要注意1e7+7不是质数,所以没有逆元,需要在取模之前除以2.
然后对于阶乘分解我们可以提前预处理出所有质数。
复杂度:O(T*n)
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,mod=1e7+7;
int vis[N],p[N],cnt,n,res;
inline void solve(){
res=1;
for(int i=1;i<=cnt&&p[i]<=n;i++){
int cnt=0,k=p[i];
while(n>=k) cnt+=n/k,k*=p[i];
res=res*((cnt+1)*(cnt+2)/2)%mod;
}
printf("%lld\n",res);
}
signed main(){
for(int i=2;i<N-5;i++) if(!vis[i]){
p[++cnt]=i;
for(int j=i+i;j<N-5;j+=i) vis[j]=1;
}
while(cin>>n,n) solve();
return 0;
}