Codeforces396A

Portal

Description

给出(n(nleq500))([1,10^9])的数,令(m=prod_{i=1}^n a_i)。求有多少个有序排列({a_n}),使得(prod_{i=1}^n a_i=m)。答案(mod 10^9+7);两个有序排列不同当且仅当(exists i,a_i eq b_i)

Solution

(m)分解质因数,即(m=prod_{i=1}^t p_i^{k_i})
(m)分配到(n)个数上,相当于依次(k_i)(p_i)分配到(n)个数上。因为(p_i)均不相同,所以不会出现重复的计算。即:

[ans=prod_{i=1}^t C(n+k_i-1,n-1)$$ 因为$k_i$不超过$nlog_210^9< 15000$,所以可以开数组`C[15000][500]`。 > 时间复杂度$O(?)$,分解质因数复杂度怎么算呀... ##Code ``` //On Number of Decompositions into Multipliers #include <cstdio> #include <cstring> #include <map> using namespace std; typedef long long lint; int const N0=1e5+10; lint const H=1e9+7; map<int,int>::iterator it; map<int,int> cnt; bool isP[N0]; int cntP,P[N0]; lint C[15000][510]; void init() { memset(isP,true,sizeof isP); for(int i=2;i<=1e5;i++) { if(isP[i]) P[++cntP]=i; for(int j=1;j<=cntP;j++) { if(i*P[j]>1e5) break; isP[i*P[j]]=false; if(i%P[j]==0) break; } } for(int i=0;i<15e3;i++) C[i][0]=1; for(int i=1;i<15e3;i++) for(int j=1;j<=i&&j<=500;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%H; } int n; int main() { init(); scanf("%d",&n); for(int owo=1;owo<=n;owo++) { int x; scanf("%d",&x); for(int i=1;i<=cntP;i++) while(x%P[i]==0) cnt[P[i]]++,x/=P[i]; if(x!=1) cnt[x]++; } lint ans=1; for(it=cnt.begin();it!=cnt.end();it++) ans*=C[it->second+n-1][n-1],ans%=H; printf("%lld ",ans); return 0; } ``` ##P.S. 我VisJiao就是打死,也不吃STL一口饭! ...真香]

原文地址:https://www.cnblogs.com/VisJiao/p/Cf396A.html