传送门
排列组合入门题。
令
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}
X=p1a1p2a2..pkak
那么答案1就等于
∑
i
=
1
k
a
i
\sum_{i=1}^ka_i
∑i=1kai
答案2等于
(
∑
i
=
1
k
a
i
)
!
∏
i
=
1
k
a
[
i
]
!
\frac {(\sum_{i=1}^ka_i)!} {\prod_{i=1}^ka[i]!}
∏i=1ka[i]!(∑i=1kai)!
边分解质因数边统计就行了。
代码:
#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;
}