Divisors of the Divisors of An Integer

題目鏈接: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章