题目链接:

https://vjudge.net/problem/POJ-3421

题目大意:

给你一个数X,将X分解成1~X的因子数列,前一个数可以整数后一个数,求满足条件的最大链长以及有多少条这样长的链。

思路一:

自己的解答:

首先求出所有的因子,排序,然后定义一个length数组和tot数组,length[i]表示从第i个因子到最后一个因子的最大链长,tot[i]表示第i个因子到最后一个因子的最大链长的种类,要求length[0]和tot[0]

已知length[last] = 0,tot[last] = 1(即最后一个因子的链长记为0,这里记为0的话,最后就不用减一,因为题目中第一个因子1不计入链长,数目记为1)

然后就是从后往前的递推式:可以看个例子:

n = 100

下标  0  1  2  3  4  5  6   7  8

因子  1  2  4  5  10  20   25   50  100

length  4       3  2  3  2  1  2  1  0

因子50,100可以整除50,那么length[(50)] = length[(100)] + 1 = 1

因子25,50可以整除25,那么length[(25)] = length[(50)] + 1 = 2

同理可求出上述的length数组

递推式就是length[i] = length[j] + 1(其中下标为j的因子是最小的可以整除下标为i的因子)

然后就可以推出tot数组

tot数组就相当于length从后往前有多少个0 1 2 3 4的序列

n = 100

下标  0  1  2  3  4  5  6   7  8

因子  1  2  4  5  10  20   25   50  100

length  4       3  2  3  2  1  2  1  0

tot        6       3  1  3  2  1  1  1  1

1、对于因子50的length=1,因子100的length=0,且100整除50,所以tot[(50)]=tot[(100)]=1 相当于从50开始到最后只有一条路,就是50,100

2、对于因子25的length=2,因子50的length=1,且50整除25,所以tot[(25)] = tot[(50)] = 1 相当于从25开始到最后只有一条路,就是25,50,100‘

3、对于因子20的length=1,因子100的length=0,且100整除20,所以tot[(20)] = tot[(100)] = 1 相当于从20开始只有一条路,就是20,100

4、对于因子10的length=2,因子20和50的length=1,且20和50均整除10,所以tot[(10)]=tot[(50)]+tot[(20)]=2 相当于从10开始有两条路,是10,20,100或者10,50,100

5、对于因子5的length=3,因子10和25的length=2,且10和25均整除5,所以tot[(5)]=tot[(10)]+tot[(25)]=3 相当于从5开始有三条路,是5,10,20,100或者5,10,50,100或者5,25,50,100

6、对于因子4的length=2,因子20和50的length=1,且20整除4,50不整除4,所以tot[(4)]=tot[(20)]=1 相当于从4开始有一条路,是4,20,100

7、对于因子2的length=3,因子4和10和25的length=1,且4和10整除2,25不整除2,所以tot[(2)]=tot[(4)]+tot[(10)]=3 相当于从2开始有三条路,是2,4,20,100或者2,10,20,100或者2,10,50,100

8、对于因子1的length=4,因子2和5的length=3,且2和5均整除1,所以tot[(1)]=tot[(2)]+tot[(5)]=6 相当于从1开始有六条路,是1,2,10,20,100或者1,2,10,50,100或者1,2,4,20,100或者1,5,10,20,100或者1,5,10,50,100或者1,5,25,50,100

递推式:tot[i] = sum(tot[j]) 其中第j个因子的length=第i个因子的length-1,并且第j个因子整除第i个因子

上述递推式文字说明比较繁琐,但是理解之后就特别简单,抓紧题目的意思,后一个因子整除前一个因子,然后递推式就可以想出来了。

 1 #include<iostream>
 2 #include<vector>
 3 #include<queue>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<cstdio>
 7 #include<set>
 8 #include<map>
 9 #include<cmath>
10 using namespace std;
11 typedef pair<int, int> Pair;
12 typedef long long ll;
13 const int INF = 0x3f3f3f3f;
14 int T, n, m;
15 int length[1005], tot[1005];
16 vector<int> divisor(int n)
17 {
18     vector<int>res;
19     for(int i = 1; i * i <= n; i++)
20     {
21         if(n % i == 0)
22         {
23             res.push_back(i);
24             if(i != n / i)res.push_back(n / i);
25         }
26     }
27     return res;
28 }
29 int main()
30 {
31     while(cin >> n)
32     {
33         vector<int>a = divisor(n);
34         sort(a.begin(), a.end());
35         memset(length, 0, sizeof(length));
36         memset(tot, 0, sizeof(tot));
37         int m = a.size();
38         length[m - 1] = 0;
39         for(int i = m - 2; i >= 0; i--)
40         {
41             for(int j = i + 1; j < a.size(); j++)
42             {
43                 if(a[j] % a[i] == 0)
44                 {
45                     length[i] = length[j] + 1;
46                     break;
47                 }
48             }
49         }
50         tot[m - 1] = 1;
51         for(int i = m - 2; i >= 0; i--)
52         {
53             for(int j = i + 1; j < m; j++)
54             {
55                 if(length[j] + 1 == length[i])
56                 {
57                     if(a[j] % a[i] == 0)
58                         tot[i] += tot[j];
59                 }
60             }
61         }/*
62         for(int i = 0; i < m; i++)
63         {
64             cout<<a[i]<<" "<<length[i]<<" "<<tot[i]<<endl;
65         }*/
66         cout<<length[0]<<" "<<tot[0]<<endl;
67     }
68 }

思路二:

网上常规方法,直接求出所有素因子,然后素因子的数目就是链长,不难理解,每次递增的时候,前一个因子乘上一个素因子,直到所有素因子乘完,就到达n了

具体的数目就是这些素因子的排列组合的数目,比如100=2*2*5*5,素因子4个,排列组合次数为4!/(2!*2!) = 6,就是简单的组合数学

代码随便在网上找就行了,这里就不赘述了

转载于:https://www.cnblogs.com/fzl194/p/8811089.html

POJ-3421 X-factor Chains---求因子+递推 或 素因子+组合数学相关推荐

  1. BM求线性递推模板(杜教版)

    BM求线性递推模板(杜教版) BM求线性递推是最近了解到的一个黑科技 如果一个数列.其能够通过线性递推而来 例如使用矩阵快速幂优化的 DP 大概都可以丢进去 则使用 BM 即可得到任意 N 项的数列元 ...

  2. 计算机控制求输出递推计算题,2020计算思维复习

    只是供自己复习使用,无参考价值.本人无法对以下内容的准确性做保证,大家看看就好. 如发现错误,希望大家多多指正. 第一章: 1.什么是计算思维(书P17) PPT上的: "计算思维就是运用计 ...

  3. POj 3420 Quad Tiling 状态压缩DP+递推+矩阵快速幂

    哈哈,写了好久的,总算对了. 接下来介绍两种思路: 先介绍一种   递推+矩阵的快速幂的方法 一种DP的思想考虑4×n的最后一列  ,可以放的方法一共有5种 1.放4个 1×2  则 为dp[n-2] ...

  4. 【组合数学】递推方程 ( 非齐次部分是 指数函数 且 底是特征根 | 求特解示例 )

    文章目录 一.非齐次部分是 指数函数 且 底是特征根的情况 二.非齐次部分是 指数函数 且 底是特征根的情况 示例 一.非齐次部分是 指数函数 且 底是特征根的情况 常系数线性非齐次递推方程 : H( ...

  5. 【算法讲26:特征方程】求齐次线性一阶递推与二阶递推通项公式 | HDU 2021多校一 Pass!

    [算法讲26:特征方程]求一阶递推与二阶递推通项公式 引入 齐次线性一阶递推 齐次线性二阶递推 题目解法 下文中详细证明略,可以看 [数列]特征方程与特征根 引入 HDU 2021多校一 Pass! ...

  6. UVA 10910 Marks Distribution(组合数学 或 递推)

    题意:一个人N门课程的总成绩为T,每门课程的最低成绩为P,求一共有多少种可能的分配方法. 题解:可以先求出超出的部分 T = T - n*p:剩余的相当于n个里面每个科目放0,1分等. 这题我只懂了递 ...

  7. 线性递推数列_学习笔记

    前置知识:线代基础(越多越好 发现了一位老哥写的笔记,精炼得相当到位 (这是博客地址嗷) . 线性递推数列 基本性质 定理1.1. 对于无限数列 { a 0 , a 1 , a 2 . . . } \ ...

  8. [常系数(非)齐次线性递推]

    从一个朴素的问题出发:我们需要求出一个序列b[],使得符合递推式 f(n)=∑i=1..kcif(n−i) f ( n ) = ∑ i = 1.. k c i f ( n − i ) f(n)=\su ...

  9. 利用配方法引入特征根法来求解二阶递推通项

    利用配方法引入特征根法来求解二阶递推通项 引言 本文从配方法的角度引入特征法来求解二阶递推通项; 利用高中的知识水平便可以理解, 笔者观察相似文章皆是聚焦于通项的推导, 并未以思考的方式去回答为何做出 ...

最新文章

  1. php7+的php-fpm参数配置,注意事项
  2. (转)Thread的中断机制(interrupt)
  3. python采集_Python采集实例2
  4. android中仿qq最新版抽屉,Android 自定义View实现抽屉效果
  5. [Android]用架构师角度看插件化(2)-Replugin 唯一hook点
  6. JAVA面试题:HashMap和Hashtable的区别
  7. Java代码有效和片段有效_Java 9 尝鲜之交互式编程环境
  8. 18Python标准库系列之logging模块
  9. 金融直播三大常用场景一文解析
  10. mac如何安装mysql可视化界面_Mac系统下安装mysql数据库和使用phpMyAdmin可视化
  11. CorelDRAW2021序列号 专业的矢量图像设计软件
  12. 超酷!极通EWEBS竟然不需微软终端服务支持
  13. 成渝城市群数据(空气质量、地图矢量、面板数据等)
  14. 1838公共政策概论
  15. SLAM之PTAM学习笔记
  16. 13-Spring动态代理
  17. 【开集识别论文解读】C2AE: Class Conditioned Auto-Encoder for Open-set Recognition——CVPR2019
  18. 真实场景的双目立体匹配(Stereo Matching)获取深度图详解
  19. 微信小程序云函数不开本地调试无法运行
  20. Idea 打包JAVA项目

热门文章

  1. python3读取txt文件数字签名_hash文件-对文件进行数字签名
  2. mysql 合计单条数据_mysql之数据去重并记录总数
  3. python打开伪终端_0xB:伪终端
  4. python实现不重复排列组合_python之itertools的排列组合相关
  5. linux时间与日期函数,Shell中关于时间和日期的函数总结
  6. c创建python虚拟机_cpython大致数据结构实现笔记
  7. 提高linux运行速度,提高Linux操作系统的运行速度
  8. java oracle executeupdate 无效_Java语言的品味(三)
  9. Lesson Plan 原文
  10. linux 4 内核 c,4. 使代码正确 — The Linux Kernel documentation