题意:
给一个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\n",sum,ans); 48 } 49 return 0; 50 }
时间: 2024-10-24 10:51:34