題目鏈接: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;
}