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