poj 3421 X-factor Chains(数因子分解)

来源:互联网 发布:java流程图是什么形状 编辑:程序博客网 时间:2024/05/12 05:23

题目链接

X-factor Chains
这里写图片描述

分析

对于整数x来说,他有质因子分解式
x=pr11pr22...prii...prnn
要使这个偏序链最长,显然让 xi+1只比 xi多一个质因子就行了,因此长度为 r1+r2+...+rn,
换一种思考方式,将多重集合{r1p1,r2p2,...,rnpn},排成一列,其中 xi 为前 i个元素相乘,这样的链一定满住条件,且为最长的,因此个数,也出来了,就是集合{r1p1,r2p2,...,rnpn}的排列数 (r1+r2+,...,+rn)!r1!r2!,...,rn!

AC code

#include <cstdio>#include <iostream>#include <vector>#include <queue>#include <algorithm>#include <cmath>#include <cstring>#include <map>#define fi first#define se secondusing namespace std;const int maxn = (1<<20)+10;const int MOD = 1e9+7;typedef long long LL;int prime[maxn];int p_size =0;void init_prime(){  memset(prime,0,sizeof(prime));  p_size = 0;  for(int i=2 ; i<maxn ; ++i){    if(!prime[i]){      prime[p_size++] = i;      for(LL j = (LL)i*i ;j<maxn  ; j+=i)prime[j] = 1;    }  }}void get_factor(int n,map<int,int>& factor){  factor.clear();  for(int i=0 ; prime[i]*prime[i]<=n ; i++){    if(n%prime[i] == 0){      while (n%prime[i] == 0) {        n /= prime[i];        ++factor[prime[i]];      }    }  }  if(n>1)++factor[n];}LL fact[22];void init_fact(){  fact[0] = 1;  for(int i=1 ; i<=20 ; ++i){    fact[i] = fact[i-1]*i;  }}int main() {  init_prime();  init_fact();  int n;  while (cin>>n) {    map<int,int> factor;    LL num = 0;    LL tmp = 1;    get_factor(n,factor);    for(map<int,int>::iterator it = factor.begin() ; it!=factor.end() ; ++it){      tmp*=fact[it->se];      num+=it->se;    }    std::cout<<num<<" " << fact[num]/tmp << '\n';  }  return 0;}
0 0
原创粉丝点击