题目:http://poj.org/problem?id=3421
好久没有独立A题了...做点水题还是有助于提升自信心的;
这题就是把 x 质因数分解,质因数指数的和 sum 就是最长的长度,因为每次至少乘一个质因数;
排列方式就是从 sum 个位置里给第一种质因数选几个位置,再在剩下的里面给第二种质因数选几个位置...
也就是 ans = ∏(1<=i<=cnt) C(n,pc[i]),n -= pc[i],其中 cnt 是质因数(种类)个数,pc 是每种质因数的指数,n 就是目前剩下几个位置。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; int x,p[25],pc[25],cnt; void divide(int n) { cnt=0; memset(pc,0,sizeof pc); for(int i=2;i*i<=n;i++) if(n%i==0) { p[++cnt]=i; while(n%i==0)pc[cnt]++,n/=i; } if(n>1)p[++cnt]=n,pc[cnt]=1; } ll C(int n,int m) { if(n<m)return 0; m=min(m,n-m); ll a=1,b=1; for(int i=n-m+1;i<=n;i++)a*=i; for(int i=2;i<=m;i++)b*=i; return a/b; } int main() { while(~scanf("%d",&x)) { divide(x); int sum=0; ll ans=1; for(int i=1;i<=cnt;i++)sum+=pc[i]; int n=sum; for(int i=1;i<=cnt;i++) { ans*=C(n,pc[i]); n-=pc[i]; } printf("%d %lld ",sum,ans); } return 0; }