2018-2019 ACM-ICPC, Asia Dhaka Regional Contest C.Divisors of the Divisors of An Integer (数论)
-
题意:求\(n!\)的每个因子的因子数.
-
题解:我们可以对\(n!\)进行质因数分解,这里可以直接用推论快速求出:https://5ab-juruo.blog.luogu.org/solution-p2043, 所以我们可以得到\(n!=p^{k1}_1*p^{k_2}_2*...*p^{k_n}_n\),然后根据约数定理,它的任意一个因子可以表示为\(n!=p^{a1}_1*p^{a_2}_2*...*p^{a_n}_n\ (0\le a_i\le k_i)\),我们将某一个质数\(p^{a_i}_i\)单独拿出来分析,\(a_i\)可以选的值有\(0,1,2,...,k_i\),所以\(p^{a_i}_i\)的因子\(p^{b_i}_i\)中的\(b_i\)可以选的值有\((0),(0,1),(0,1,2),...,(0,1,...,k_i)\),那么我们用等差数列求和即可得出\(p^{a_i}_i\)的因子数贡献为\(\frac{(k_i+1)*(k_i+2)}{2}\),那么我们就可以得出答案为\(\prod^{n}_{i=1}(\frac{(k_i+1)*(k_i+2)}{2})\).
-
代码:
int n; int prime[N],cnt; bool st[N]; void get_prime(){ for(int i=2;i<=1e6+10;++i){ if(!st[i]) prime[cnt++]=i; for(int j=0;j<cnt && prime[j]<=(1e6+10)/i;++j){ st[i*prime[j]]=true; if(i%prime[j]==0) break; } } } int divide(int p,int x){ int res=0; while(p){ res+=p/x; p/=x; } return res; } signed main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); get_prime(); while(cin>>n){ if(n==0) break; int ans=1; for(int i=0;i<cnt && prime[i]<=n;++i){ int cur=divide(n,prime[i]); ans=ans%mod*((cur+1)*(cur+2)/2)%mod; } cout<<ans<<'\n'; } return 0; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮