cf C On Number of Decompositions into Multipliers

题意:给你n个数,然后把这个n个数的乘积化成n个数相乘,可以化成多少个。

思路:分解质因数,求出每一个质因子的个数,然后用组合数学中隔板法把这些质因子分成n分,答案就是所有质因子划分成n份的情况的乘积。

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <map>

 4 #include <algorithm>

 5 #define maxn 100100

 6 #define ll long long

 7 using namespace std;

 8 const int mod=1000000007;

 9 

10 int n;

11 int a[maxn];

12 ll c[17010][600];

13 

14 int main()

15 {

16     scanf("%d",&n);

17     map<int,int>q;

18     c[0][0]=1;

19     for(int i=1; i<=15000; i++)

20     {

21         c[i][0]=1;

22         for(int j=1; j<=502; j++)

23         {

24             c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;

25         }

26     }

27     for(int i=1; i<=n; i++)

28     {

29         scanf("%d",&a[i]);

30         int m=a[i];

31         for(int i=2; i*i<=m; i++)

32         {

33             if(m%i==0)

34             {

35                 while(m%i==0)

36                 {

37                     q[i]++;

38                     m/=i;

39                 }

40             }

41         }

42         if(m>1)

43         {

44             q[m]++;

45         }

46     }

47     ll ans=1;

48     map<int,int>::iterator it;

49     for(it=q.begin(); it!=q.end(); it++)

50     {

51         int xx=it->second;

52         ans*=c[xx+n-1][n-1];

53         ans%=mod;

54     }

55     printf("%lld\n",ans);

56     return 0;

57 }
View Code

 

你可能感兴趣的:(position)