博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[9.28模拟] good
阅读量:6969 次
发布时间:2019-06-27

本文共 1192 字,大约阅读时间需要 3 分钟。

题意:给出一个单调递增的序列{

\(a_i\)},要你构造一个序列{
\(x_i\)},使得:
1、\(x_i\in{\{a_i}\}\)
2、\(\{x_i\}\)单调递增
3、\(gcd(x_i,x_i+1)>1\)
求出最长的\(\{x_i\}\)序列

题解:

dp

dp[i]表示选第i个数的最大长度

显然可以\(n^2\)的实现

考虑如何优化

利用gcd的性质,一个数只会被与它有公共质因子的数转移到,所以当一个数要被与它某一个质因子相同的数转移时,我们只需要考虑已知贡献最大的那个数即可

所以分解出每个数的质因子,利用每一个质因子作为代表进行转移即可

#include
#include
#include
#include
#include
#include
#include
#define ll long long#define N 100010using namespace std;int n,cnt,ans,dp[N],pri[N],a[N],c[N];bool mark[N];vector
ve[N];int gi() { int x=0,o=1; char ch=getchar(); while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar(); if(ch=='-') o=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar(); return o*x;}void pre() { for(int i=2; i<=100000; i++) { if(!mark[i]) pri[++cnt]=i; for(int j=1; j<=cnt && i*pri[j]<=100000; j++) { mark[i*pri[j]]=1; if(i%pri[j]==0) break; } } for(int j=1; j<=cnt; j++) for(int i=pri[j]; i<=100000; i+=pri[j]) ve[i].push_back(pri[j]); }int main() { n=gi(); pre(); for(int i=1; i<=n; i++) a[i]=gi(); for(int i=1; i<=n; i++) { int siz=ve[a[i]].size(); for(int j=0; j

转载于:https://www.cnblogs.com/HLXZZ/p/7617486.html

你可能感兴趣的文章
web移动端与Hybird开发知识整理
查看>>
用最新的 Alamofire(swift 4.1) (带参数)post方法上传图片到服务器
查看>>
我设计一个phpms框架前的准备
查看>>
小程序--语音合成tts 对接多平台(讯飞,思必驰,百度)
查看>>
Node.js文件上传
查看>>
tp5 加载 extend 类库的方法 (有命名空间和没有命名空间的调用)
查看>>
运营一款电视盒子需要注意什么?
查看>>
网络协议 9 - TCP(下)
查看>>
js中的模块化——commonjs,AMD,CMD,UMD,ES6
查看>>
Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码
查看>>
Linux telnet命令
查看>>
用过的一些Markdown编辑器
查看>>
【刷算法】LeetCode.326-3的幂
查看>>
追踪解析Spring ioc启动源码(3)
查看>>
学习区块链中的主要问答
查看>>
5步告诉你QQ音乐的完美音质是怎么来的,播放器的秘密都在这里
查看>>
VisualVm利用SSL连接JMX的方法
查看>>
Linux docker-compose 实战
查看>>
Python--Redis实战:第四章:数据安全与性能保障:第6节:Redis事务
查看>>
Redis中使用Lua的一些优化和注意事项
查看>>