题目链接:

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                     

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个因子

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

 #include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<set>
#include<map>
#include<cmath>
using namespace std;
typedef pair<int, int> Pair;
typedef long long ll;
const int INF = 0x3f3f3f3f;
int T, n, m;
int length[], tot[];
vector<int> divisor(int n)
{
vector<int>res;
for(int i = ; i * i <= n; i++)
{
if(n % i == )
{
res.push_back(i);
if(i != n / i)res.push_back(n / i);
}
}
return res;
}
int main()
{
while(cin >> n)
{
vector<int>a = divisor(n);
sort(a.begin(), a.end());
memset(length, , sizeof(length));
memset(tot, , sizeof(tot));
int m = a.size();
length[m - ] = ;
for(int i = m - ; i >= ; i--)
{
for(int j = i + ; j < a.size(); j++)
{
if(a[j] % a[i] == )
{
length[i] = length[j] + ;
break;
}
}
}
tot[m - ] = ;
for(int i = m - ; i >= ; i--)
{
for(int j = i + ; j < m; j++)
{
if(length[j] + == length[i])
{
if(a[j] % a[i] == )
tot[i] += tot[j];
}
}
}/*
for(int i = 0; i < m; i++)
{
cout<<a[i]<<" "<<length[i]<<" "<<tot[i]<<endl;
}*/
cout<<length[]<<" "<<tot[]<<endl;
}
}

思路二:

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

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

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

POJ-3421 X-factor Chains---求因子+递推 或 素因子+组合数学的更多相关文章

  1. 2018 焦作网络赛 L Poor God Water ( AC自动机构造矩阵、BM求线性递推、手动构造矩阵、矩阵快速幂 )

    题目链接 题意 : 实际上可以转化一下题意 要求求出用三个不同元素的字符集例如 { 'A' .'B' .'C' } 构造出长度为 n 且不包含 AAA.BBB CCC.ACB BCA.CAC CBC ...

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

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

  3. bzoj4161 (k^2logn求线性递推式)

    分析: 我们可以写把转移矩阵A写出来,然后求一下它的特征多项式,经过手动计算应该是这样的p(x)=$x^k-\sum\limits_{i=1}^ka_i*x^{k-i}$ 根据Cayley-Hamil ...

  4. Berlekamp Massey算法求线性递推式

    BM算法求求线性递推式   P5487 线性递推+BM算法   待AC.   Poor God Water   // 题目来源:ACM-ICPC 2018 焦作赛区网络预赛 题意   God Wate ...

  5. POJ 2441 Arrange the Bulls 状态压缩递推简单题 (状态压缩DP)

    推荐网址,下面是别人的解题报告: http://www.cnblogs.com/chasetheexcellence/archive/2012/04/16/poj2441.html 里面有状态压缩论文 ...

  6. POJ 1737 Connected Graph(高精度+DP递推)

    题面 \(solution:\) 首先做个推销:带负数的压位高精度(加减乘+读写) 然后:由 \(N\) 个节点组成的无向图的总数为: \(2^{N*(N-1)/2}\) (也就是说这个图总共有 \( ...

  7. P1067Warcraft III 守望者的烦恼(十大矩阵问题之七求递推式)

    https://vijos.org/p/1067 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她 ...

  8. 线性齐次递推式快速求第n项 学习笔记

    定义 若数列 \(\{a_i\}\) 满足 \(a_n=\sum_{i=1}^kf_i \times a_{n-i}\) ,则该数列为 k 阶齐次线性递推数列 可以利用多项式的知识做到 \(O(k\l ...

  9. 【THUSC2017】【LOJ2981】如果奇迹有颜色 DP BM 打表 线性递推

    题目大意 有一个 \(n\) 个点的环,你要用 \(m\) 中颜色染这 \(n\) 个点. 要求连续 \(m\) 个点的颜色不能是 $1 \sim m $ 的排列. 两种环相同当且仅当这两个环可以在旋 ...

随机推荐

  1. 笔记:Spring Cloud Hystrix 服务容错保护

    由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加 ...

  2. Java并发系列[9]----ConcurrentHashMap源码分析

    我们知道哈希表是一种非常高效的数据结构,设计优良的哈希函数可以使其上的增删改查操作达到O(1)级别.Java为我们提供了一个现成的哈希结构,那就是HashMap类,在前面的文章中我曾经介绍过HashM ...

  3. poj-3660-cows contest(不懂待定)

    Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming con ...

  4. Tomact高并发&Servlet线程处理

    Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率.由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的安全性问题.然而 ...

  5. 【Django】Web应用开发经由

    [Django开发经由] 本来以为看完网上的入门教程之后就可以看书详细学习一下,没想到手头上的这本书也讲得不是太详细..无奈,不过好在这本书从无到有建立一个网站的流程还算可以,就以这个角度简单记录一下 ...

  6. linux服务器中毒可疑进程sfewfesfs CPU80%

    我用的是wdlinux, 难免会有漏洞,不知怎么就被莫名其妙地给入侵了,而且还频繁发包.下面是我查看攻击机器的整个过程. 首先跟客户要了root密码登录看,第一个命令是就top cd /proc/25 ...

  7. 设计模式 --> (13)备忘录模式

    备忘录模式 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态 示例 玩游戏时都会保存进度,所保存的进度以文件的形式存在.这样下次就可 ...

  8. iOS 代码开发规范

    最近公司因为业务增多,又招了一个iOS小伙伴,内心无比开心呀.但是多了一个人,日常代码开发就要统一规范起来,方便日后维护和查找.下边列一下我日常用到一些代码规范. (一).SVN规范 1.代码一定要先 ...

  9. SpringMVC DispatcherServlet 启动和加载过程(源码调试)

    在阅读本文前,最好先阅读以下内容(当然,如果对 Servlet 已经有所了解,则可跳过): http://www.cnblogs.com/cyhbyw/p/8682078.html http://ww ...

  10. LeetCode---Container With Most Water(11)

    Description: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordin ...