POJ 3421 X-factor Chains | 数论

题意:

给一个x,求最长的排列满足开头是1,结尾是x,前一个数是后一个数的因子

输出长度和这样序列的个数


题解:

把x分解质因数,质因数个数就是答案,接下来考虑怎么求个数

显然这是一个可重集合全排列问题,设有n个元素

答案就是n!/每个元素出现次数的阶乘

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 typedef long long ll;
 5 #define N 2000
 6 using namespace std;
 7 int prime[N],n,cnt[N],pcnt,sum;
 8 ll jc[21];
 9 bool isp[N];
10 void init()
11 {
12     memset(isp,1,sizeof(isp));
13     isp[1]=0;
14     for (int i=2;i<N;i++)
15     {
16     if (isp[i]==1)
17         prime[++pcnt]=i;
18     for (int j=1;j<=pcnt && i*prime[j]<N;j++)
19     {
20         isp[i*prime[j]]=0;
21         if (i%prime[j]==0) break;
22     }
23     }
24 }
25 int main()
26 {
27     jc[0]=1;
28     for (int i=1;i<=20;i++)
29     jc[i]=jc[i-1]*i;
30     init();
31     while (scanf("%d",&n)!=EOF)
32     {
33     ll ans=0;
34     memset(cnt,0,sizeof(cnt));
35     sum=0;
36     for (int i=1;i<=pcnt;i++)
37     {
38         if (n==1) break;
39         while (n%prime[i]==0)
40         n/=prime[i],cnt[i]++,sum++;
41     }
42     if (n>1)
43         sum++;
44     ans=jc[sum];
45     for (int i=1;i<=pcnt;i++)
46         ans/=jc[cnt[i]];
47     printf("%d %lld
",sum,ans);
48     }
49     return 0;
50 }
原文地址:https://www.cnblogs.com/mrsheep/p/7898803.html