2018.10.26 poj3421X-factor Chains(数论+排列组合)

35 篇文章 0 订阅
28 篇文章 0 订阅
这是一道排列组合入门题目,要求求解X=p1a1p2a2..pkak中答案1(即各质因数指数之和)和答案2(各质因数阶乘的乘积除以所有质因数指数阶乘的乘积)。解题策略是先进行质因数分解,然后统计指数并计算结果。
摘要由CSDN通过智能技术生成

传送门
排列组合入门题。


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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值