Peter's codebook A blog full of codes

POJ 3421 X-factor Chains

Factor!

傳送門

POJ3421

題目概述

求出X 的 Factor chain。

解題想法

先解出 X 的因式分解,最大的 X-factor chain 長度就是指數項相加,該長度的 chain 種類即是所有組成 X 的質因數的組合數(在這裡若分解得到 可以看成 2,2,2 的序列)。 先求出階層,再求組合數會是個好主意。

程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

map<int,int> pd(int n) {
    map<int,int> r;
    for(int i=2; i*i<=n; ++i) {
        while(n%i==0) {
            ++r[i];
            n/=i;
        }
    }
    if(n!=1) r[n]=1;
    return r;
}

long long int P[30];
void p(int n) {
    long long int ans=1;
    for(int i=1; i<=n; ++i) {
        ans*=i;
        P[i]=ans;
    }
}

pair<int,long long int> solv(int n) {
    map<int,int> d=pd(n);
    long long int cnt=0;
    int len=0;
    for(map<int,int>::iterator v=d.begin(); v!=d.end(); ++v) {
        len+=(v->second);
    }
    cnt=P[len];
    for(map<int,int>::iterator v=d.begin(); v!=d.end(); ++v) {
        cnt /= P[(v->second)];
    }
    return make_pair(len, cnt);
}


int main(void) {
    int n;
    p(20);
    while(scanf("%d",&n)!=EOF) {
        pair<int,long long int> ans=solv(n);
        printf("%d %lld\n",ans.first, ans.second);
    }
    return 0;
}
comments powered by Disqus