zoukankan      html  css  js  c++  java
  • poj3421 X-factor Chains

    题意:

    Description

    Given a positive integer X, an X-factor chain of length m is a sequence of integers,

    1 = X0X1X2, …, Xm = X

    satisfying

    Xi < Xi+1 and Xi | Xi+1 where a | b means a perfectly divides into b.

    Now we are interested in the maximum length of X-factor chains and the number of chains of such length.

    Input

    The input consists of several test cases. Each contains a positive integer X (X ≤ 220).

    Output

    For each test case, output the maximum length and the number of such X-factors chains.

    Sample Input

    2
    3
    4
    10
    100

    Sample Output

    1 1
    1 1
    2 1
    2 2
    4 6

    思路:

    一开始想到dp。令dp[i][j]表示长度为i,以j结尾的链的个数,于是dp[i+1][k] += dp[i][j] (j为k的因子),然而复杂度高,并不会优化。

    后来发现要想链最长,只能从1开始,每次乘上这个数的某个质因子才行。于是就变成了分解质因子+排列组合的问题。

    实现:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <vector>
     5 #include <algorithm>
     6 #include <map>
     7 using namespace std;
     8 typedef long long ll;
     9 
    10 ll fac[21];
    11 int x;
    12 
    13 void init()
    14 {
    15     fac[0] = 1;
    16     for (ll i = 1; i <= 20; i++)
    17         fac[i] = fac[i - 1] * i;
    18 }
    19 
    20 map<int, int> prime_factor(int n)
    21 {
    22     map<int, int> res;
    23     for (int i = 2; i * i <= n; i++)
    24     {
    25         while (n % i == 0)
    26         {
    27             res[i]++;
    28             n /= i;
    29         }
    30     }
    31     if (n != 1)
    32         res[n] = 1;
    33     return res;
    34 }
    35 
    36 int main()
    37 {
    38     init();
    39     while (scanf("%d", &x) != EOF)
    40     {
    41         map<int, int> f = prime_factor(x);
    42         map<int, int>::iterator it;
    43         ll res = 1;
    44         int cnt = 0;
    45         for (it = f.begin(); it != f.end(); it++)
    46         {
    47             res *= fac[it->second];
    48             cnt += it->second;
    49         }
    50         printf("%d %lld
    ", cnt, fac[cnt] / res);
    51     }
    52     return 0;
    53 }
  • 相关阅读:
    关于在前台.aspx页面中应用变量的方法
    web.config中配置数据库连接字符串
    PHP性能优化:APC可选PHP缓存
    Laruence谈:深入理解Javascript之this关键字
    用 yum 安装 Apache、Mysql、PHP
    Linux下which、whereis、locate、find 命令的区别
    时间复杂度、空间复杂度
    yum 和 aptget 用法及区别
    How browsers work
    Linux File Permission
  • 原文地址:https://www.cnblogs.com/wangyiming/p/6443982.html
Copyright © 2011-2022 走看看