1. 程式人生 > >2018.10.26 poj3421X-factor Chains(數論+排列組合)

2018.10.26 poj3421X-factor Chains(數論+排列組合)

傳送門
排列組合入門題。


X = p 1 a 1 p

2 a 2 . . p k a
k
X=p_1^{a_1}p_2^{a_2}..p_k^{a_k}
那麼答案1就等於 i =
1 k a i \sum_{i=1}^ka_i

答案2等於 ( i = 1 k a i ) ! i = 1 k a [ i ] ! \frac {(\sum_{i=1}^ka_i)!} {\prod_{i=1}^ka[i]!}
邊分解質因數邊統計就行了。
程式碼:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=1e6+5;
int tot=0,n,pri[N];
bool vis[N];
long long ans1,ans2,fac[25];
inline void init(){
	fac[0]=1;
	for(int i=1;i<=20;++i)fac[i]=fac[i-1]*i;
	for(int i=2;i<=1e6;++i){
		if(!vis[i])pri[++tot]=i;
		for(int j=1;j<=tot&&i*pri[j]<=1e6;++j){
			int k=i*pri[j];
			vis[k]=1;
			if(!(i%pri[j]))break;
		}
	}
}
int main(){
	init();
	while(~scanf("%d",&n)){
		ans1=0,ans2=1;
		for(int i=1;pri[i]*pri[i]<=n;++i){
			if(!(n^1))break;
			int a=pri[i],b=0;
			if(n!=n/a*a)continue;
			while(n==n/a*a)n/=a,++b;
			ans1+=b,ans2*=fac[b];
		}
		if(n^1)++ans1;
		cout<<ans1<<' '<<fac[ans1]/ans2<<'\n';
	}
	return 0;
}