当前位置: 首页 > news >正文

Codeforces 264B Good Sequences ★ (分解素因子+DP)

题目链接: http://codeforces.com/problemset/problem/264/B 题目大意:给定一个数列a1,a2,a3,a4,……,an(数据保证ai严格递增,n<=10^5),求最长的good序列长度:①序列严格递增  ②序列相邻两数不能互素.   题目乍一看好像是nlogn二分+DP的最长上升子序列,但其实这题和LIS一点儿关系都没有……因为数列本身就是严格递增的. 但是此题还需要借鉴LIS的思想,独特的是我们把素因子作为DP的状态,c[pi]表示前面以素数pi为因子的数结尾的最长序列的长度,f[i]表示以第i个数结尾的最长序列的长度。然后我们从左到右扫描序列,每次对当前第i个数分解素因子p1,p2,p3,……pn,找到其中c[pi]最大的,那么我们把此数连到该序列尾便形成了以该数为结尾的最长的good序列。注意完了之后还需要再更新各c[pi]。  

#include 
#include 
#include 
#include 
using namespace std;
#define MAX 100010
int a[MAX],f[MAX],c[MAX];
bool noprime[MAX];
vector  prime;
int gcd(int a, int b){
    return b?gcd(b, a%b):a;
}
void Prime(){
    for (int i = 2; i <= 100000; i ++){
        if (!noprime[i]){
            prime.push_back(i);
        }
        for (int j = 0; j < prime.size() && prime[j] * i <= 100000; j ++){
            noprime[prime[j]*i] = 1;
            if (i % prime[j] == 0)  break;
        }
    }
}
int main(){
    Prime();
    int n;
    cin >> n;
    for (int i = 0; i < n; i ++){
        cin >> a[i];
        int tmp = a[i];
        f[i] = 1;
        for (int j = 0; j < prime.size(); j ++){
            int p = prime[j];
            if (p * p > tmp)
                break;
            if (tmp % p == 0){
                f[i] = max(f[i], c[p] + 1);
                while(tmp % p == 0)
                    tmp /= p;
            }
        }
        if (tmp > 1){
            f[i] = max(f[i], c[tmp] + 1);
        }
        for (int j = 0; j < prime.size(); j ++){
            int p = prime[j];
            if (p * p > a[i])
                break;
            if (a[i] % p == 0){
                c[p] = f[i];
                while(a[i] % p == 0)
                    a[i] /= p;
            }
        }
        if (a[i] > 1){
            c[a[i]] = f[i];
        }
    }

    int maxn = 1;
    for (int i = 0; i < n; i ++)
        if (f[i] > maxn)
            maxn = f[i];
    cout << maxn << endl;
}
 

转载于:https://www.cnblogs.com/AbandonZHANG/archive/2013/01/21/4114202.html

相关文章:

  • Unity(五):使用场景Ⅱ:用于单例模式
  • 【ZZ】9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路...
  • 密码绑定至密码文本框中
  • 使用PowerDesigner建立数据库模型
  • outerHTML兼容方法(jquery)
  • 解决compilation debug=true targetFramework=4.0 问题
  • Python学习笔记《Python核心编程》第13章 面向对象编程
  • GDI+ 图片高亮处理
  • int 反射到未知的 Enum , 使用 Enum.ToObject
  • USACO 3.1.1 Agri-Net
  • 关于SharePoint 2010 SP1
  • IE6,7下LI浮动不能自动换行,最后一行被隐藏掉解决办法
  • win7 64位注册表操作兼容问题解决(vc6)
  • 没有安装或未能初始化关联的源代码管理插件
  • 3DMAX与MAYA的区别
  • C++类中的特殊成员函数
  • eclipse(luna)创建web工程
  • iOS 系统授权开发
  • springMvc学习笔记(2)
  • 码农张的Bug人生 - 初来乍到
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前端面试总结(at, md)
  • 使用 @font-face
  • 微信小程序:实现悬浮返回和分享按钮
  • 为什么要用IPython/Jupyter?
  • 白色的风信子
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #define、const、typedef的差别
  • #pragam once 和 #ifndef 预编译头
  • (LeetCode 49)Anagrams
  • (八)Flask之app.route装饰器函数的参数
  • (初研) Sentence-embedding fine-tune notebook
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (九)信息融合方式简介
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (三十五)大数据实战——Superset可视化平台搭建
  • (学习日记)2024.01.09
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 服务 ServiceController
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @JsonFormat与@DateTimeFormat注解的使用
  • [04] Android逐帧动画(一)
  • [CentOs7]iptables防火墙安装与设置
  • [CSS3备忘] transform animation 等
  • [i.MX]飞思卡尔IMX6处理器的GPIO-IOMUX_PAD说明
  • [Java安全入门]三.CC1链
  • [java基础揉碎]方法的重写/覆盖