POJ 3421 X-factor Chains
問題
整数Xに対してX-factor chainとは次を満たす列のことを言う。
1 = X0 < X1 < …… < Xm = X;
かつXi+1はXiで割りきれる。
正の整数Xが与えられたとき、このような列のうち最大の長さをもつものおよび、
そのような長さを持つ列の数を出力せよ。
制約条件
X≦2^20
方針
長さ最長のX-factor chainは、
Xの素因数をp,q,r,sなどとおけば
1→(p倍する)→(q倍する)→(r倍する)→(s倍する)
というふうに、素因数をかけていくことで作れる。
したがって長さは素因数の数で、列の数は素因数を並べ替える順列の数である。
ソースコード
ll fact(int n){ ll ret=1; rep(i,n)ret*=i+1; return ret; } int main(){ int n; while(~scanf("%d",&n)){ vector<int> f; for(int i=2;i*i<=n;i++)if(n%i==0){ int cnt=0; while(n%i==0)cnt++, n/=i; f.pb(cnt); } if(n>1)f.pb(1); int len=0; ll ans=1; rep(i,f.size())len+=f[i]; ans*=fact(len); rep(i,f.size())ans/=fact(f[i]); printf("%d %lld\n",len,ans); } return 0; }