Coderforces 396A

来源:互联网 发布:电视盒子无法安软件 编辑:程序博客网 时间:2024/06/05 19:05

  组合数学,给出n个数,ai,然后取这n个数的积为m,计算将m分解成n个因子,问有多少种有序因子序列。

  需要知道几个基本知识,c(n,m)=c(n-1,m-1)+c(n-1,m),讲n个物品分k份,每份至少一个物品,c(n-1,k-1)。

#include <iostream>#include <map>#include <cstdio>using namespace std;map<int,int> h;const int mod=1000000007;long long c[20000][510]={0};int main(){long long n,e,ans=1;scanf("%lld",&n);c[0][0]=1;for(int i=1;i<=17000;i++){for(int j=0;j<i&&j<=n;j++){if(!j) c[i][j]=1;else c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;}c[i][i]=1;}for(int i=1;i<=n;i++) {scanf("%lld",&e);int j=1;while(j*j<=e){//若让判定条件为e大于1则会超时j++;while(e%j==0){e/=j;h[j]++;}}if(e>1) h[e]++;}for(map<int,int>::iterator ite=h.begin();ite!=h.end();ite++){int k=ite->second;ans=(ans*c[k+n-1][n-1])%mod;}cout<<ans<<endl;return 0;}


 

0 0