Codeforces Round 948 (Div. 2) C. Nikita and LCM 题解 数学

CELF(Cost-Effective Lazy Forward selection)具有成本效益的惰性前向选择算法 CELF(Cost-Effective Lazy Forward selection)算法解析      引言:在社交网络影响力最大化问题的求解过程中,我们往往需要去选择一些目标种子结点作为信息初始传播的源头。贪婪算法在传播效果上的解决可以达到影响的最大化,但是在时间复杂度上面显得确十分糟糕。为此CELF算法应势而生,CELF算法利用了函数次模性的特点,在第一轮选择种子结点时,计算网络中所有节点的边际收益,但将在之后的过程中,不再做网络节点边际收益的重复计算,这相对于传统的贪婪算法,将在时间上得到非常明显的 阅读详情

Nikita and LCM

题目描述

Nikita is a student passionate about number theory and algorithms. He faces an interesting problem related to an array of numbers.

Suppose Nikita has an array of integers a a a of length n n n. He will call a subsequence † ^\dagger † of the array special if its least common multiple (LCM) is not contained in a a a. The LCM of an empty subsequence is equal to 0 0 0.

Nikita wonders: what is the length of the longest special subsequence of a a a? Help him answer this question!

† ^\dagger † A sequence b b b is a subsequence of a a a if b b b can be obtained from a a a by the deletion of several (possibly, zero or all) elements, without changing the order of the remaining elements. For example, [ 5 , 2 , 3 ] [5,2,3] [5,2,3] is a subsequence of [ 1 , 5 , 7 , 8 , 2 , 4 , 3 ] [1,5,7,8,2,4,3] [1,5,7,8,2,4,3].

输入描述

Each test contains multiple test cases. The first line of input contains a single integer t t t ( 1 ≤ t ≤ 2000 1 \le t \le 2000 1≤t≤2000) — the number of test cases. The description of the test cases follows.

The first line of each test case contains a single integer n n n ( 1 ≤ n ≤ 2000 1 \le n \le 2000 1≤n≤2000) — the length of the array a a a.

The second line of each test case contains n n n integers a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1​,a2​,…,an​ ( 1 ≤ a i ≤ 1 0 9 1 \le a_i \le 10^9 1≤ai​≤109) — the elements of the array a a a.

It is guaranteed that the sum of n n n over all test cases does not exceed 2000 2000 2000.

输出描述

For each test case, output a single integer — the length of the longest special subsequence of a a a.

样例输入 #1

6
5
1 2 4 8 16
6
3 2 10 20 60 1
7
2 3 4 6 12 100003 1200036
9
2 42 7 3 6 7 7 1 6
8
4 99 57 179 10203 2 11 40812
1
1

样例输出 #1

0
4
4
5
8
0

原题

CF——传送门
洛谷——传送门

思路&代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int gcd(int a, int b)
{
    if (b == 0)
        return a;
    return gcd(b, a % b);
}
int lcm(int a, int b)
{
    return a / gcd(a, b) * b;
}

void solve()
{
    int n;
    cin >> n;
    vector<int> a(n);
    int ans = 0;
    map<int, int> mp; // map记录存在在数组a中的数
    int maxNum = 0;   // 我们需要先找到最大值
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
        mp[a[i]] = 1;
        maxNum = max(maxNum, a[i]);
    }
    for (int i = 0; i < n; i++)
    {
        // 如果数组中有一个数不整除最大值,那么二者的lcm一定大于最大值,即一定不在数组a中,那么最长的满足条件的子序列长度为n
        if (maxNum % a[i] != 0)
        {
            cout << n << '\n';
            return;
        }
    }
    // 我们需要知道,一旦该数组不满足上面的这种情况(即ans为n的情况),那么该数组就有存在一个性质
    // 即:数组中的任何一个数都是最大值的因数(条件1)
    // 于是我们可以知道,数组中任意取数进行lcm运算,所得到的值一定也是最大值的因数
    // 那么我们的策略就是,找到最大值的所有因数,如果该数不在数组a中,则检查其是否能由数组中的数进行lcm运算得到,如果能得到,更新ans为所有可能答案中的最大值
    auto updata = [&](int subsequence_lcm) // 更新满足条件的子序列中的最长长度
    {
        int cur_lcm = 1; // 当前在数组中的所有subsequence_lcm的因数通过lcm运算得到的值
        int cnt = 0;     // subsequence_lcm的因数个数
        for (int i = 0; i < n; i++)
        {
            if (subsequence_lcm % a[i] == 0)
            {
                cnt++;
                cur_lcm = lcm(cur_lcm, a[i]);
            }
        }
        if (cur_lcm == subsequence_lcm) // 如果subsequence_lcm能由数组中的数通过lcm运算得到,则其是满足条件的一种情况
            ans = max(ans, cnt);
    };
    for (int i = 1; i * i <= maxNum; i++) // 利用数学知识,可由maxNum/i运算得到maxNum的另一个因数,从而降低遍历复杂度
    {
        if (maxNum % i == 0)
        {
            if (mp[i] == 0)
                updata(i);
            if (mp[maxNum / i] == 0)
                updata(maxNum / i);
        }
    }
    cout << ans << '\n';
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int t;
    cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}
《网络安全自学教程》- Windows安全机制:安全标识符,身份鉴别和访问控制 这篇文章详细介绍Windows和Linux如何标识用户,如何根据标识验证用户身份,如何根据用户身份做访问控制。 阅读详情

相关推荐

Unity 数字孪生笔记1 工具介绍

前言 工欲善其事必先利其器 流程思考 数字孪生本质上一种基于实际物理数据的可视化方案,通过对接实际数据,在三维界面中展示孪生结果。 那么这个流程就很简单了。 整个流程分为三块:数据来源-》数据分析-》数据展示 输入数据 首先我们需要考虑我们能拿到什么。第一,实际物体的三维数据从哪里来,第二,实际数据怎么获取到。 模型数据 工业上常常会用到CAD模型,CAD模型具有精确、统一的特点,但是CAD不是三角面片,我们不能直接导出到Unity中,而且导入之后有很多不合理的地方,例如面片杂乱、面数过高等问题。针对这个

Thissky的专栏 1万+

C. Nikita and LCM

数论,动态规划

2301_79513570的博客 436

折叠式共源共栅放大器设计/备忘

w折叠式共源共栅基本结构如图

Czy1377004611的博客 3万+

Codeforces Round 948 (Div. 2)

思路:有个非常重要的性质,对于某一列,假设确定了这一列的哪一行有1,那么这个图已经可以确定了。思路:如果n<m,显然不行。再看n>=m的情况,可以先假定放刚好m个,在思考是否可以在接下来的步骤使方块数不变。题意:给定一个数组,找到一个子数组,需使这个子数组的lcm(最小公倍数)不存在于给定的数组,问这个子数组的最大长度是多少。题意:有n次机会,每次可以选择放一个方块或者拿走一个,问最后是否可以有m个方块。题意:构造题,懒得描述了,直接看,其中第三条可以转换成不存在连续的1或-1。

2301_80041146的博客 923

State of GPT (ChatGPT 原理及现状介绍)

要用 RLHF 的一个简单的原因就是 RLHF 模型效果更好,下面的图来源于 InstructGPT 论文,PPO (RLHF 算法) 后的模型生成的答案更被人类喜欢。karpathy 认为 RLHF 有用的原因是判别比生成更容易,让标注员去写一些 SFT 的 QA 数据对是比较难的,如果有一个 SFT 模型生成一些数据让标注员判断哪个更好就简单很多。,GPT4 最强,前三个都是 RLHF 模型,其他模型都是 SFT 模型。伯克利做的模型评测榜单。

kebijuelun的博客 3578

1.STM32H743VGT6最小系统板

此款MCU具备较大算力进行频谱运算,为复杂数据运算提供更高效的保障。该MCU具备REV-V和REV-Y两个型号,后者为新版本。

Audiation88的博客 3795

Codeforces Round 948 (Div. 2) C题 Nikita and LCM

假设整个序列lcm等于最大值,那么可以说明所有数字都是最大值的因数,所以所有子序列的lcm也一定是最大值的因数,考虑对最大值做分解,枚举答案,我们发现假设当前答案为x,只要x%序列的某个值==0,那么把序列的这个加进来是一定最优的,所以我们尽量把所有数字都加进来,最后算一下lcm是否跟当前枚举的答案一样即可更新答案。可以发现,lcm一定大于等于该序列的最大值,整个序列的lcm是很容易不在这个序列的。假设lcm不在这个序列,那么一定存在一个数字使得最大值%x不=0,答案为n。

qq_74451530的博客 346

功能安全实战系列09-英飞凌TC3xx LBIST开发详解

英飞凌Tricore/LBIST开发详解

initiallizer的博客 1106

Nikita and LCM

没啥思路看样例,不难发现一种特殊情况,即\(lcd(a_1,a_2,...,a_n)>a_n\)(\(a\)已经经过排序了),那么答案显然就是\(n\) 否则的话,有所有数都是\(a_n\)的约数,于是任取若干个数出来,他们的LCM一定也是\(a_n\)的约数(公倍数一定是最小公倍数的约数),于是我们枚举\(a_n\)的约数\(x\),取出数列中所有是\(x\)的约数的数(一定是所有,因为...

dingxingdi的博客 346

VTK API 详解(134):vtkOBJWriter - 写入 OBJ 模型

是 VTK 中用于将数据写入 Wavefront OBJ 文件格式的类。OBJ 格式是广泛支持的 3D 网格模型格式,支持顶点、面和基本几何信息的保存,便于模型在多种三维软件间交换。

yumeiguo的博客 140

基于STM32L4XX、HAL库的 TMC2660C-PA 驱动程序设计

/ 默认灵敏度和电流。// 20/31最大电流。

zhusl6688的博客 384

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 239

ESP-IDF OTA升级过程中遇到的“esp_transport_read returned:-1 and errno:128”问题(4)

ESP-IDF OTA升级过程中遇到的“esp_transport_read returned:-1 and errno:128”问题(4)

phmatthaus的专栏 1532

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 391

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 338

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

跟我学c++中级篇—类型定义的方式

本文系统阐述了编程中类型定义的重要性及c++中的实现方式。重点对比了宏定义、typedef与modern using三种机制,指出using在可读性、灵活性和模板支持上的优势,推荐优先使用。同时提醒开发者注意别名滥用、类型歧义、错误信息冗长等问题,强调统一规范与合理设计。最终结论:在现代c++开发中,应以using为主,兼顾简洁性与可维护性,避免陷入命名混乱与编译困境。

fpcc的专栏 68

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【C语言】字符与字符串函数

C语言中字符串为以\0结尾的字符数组,标准库函数基于此约定。本文解析字符串内存布局,详解ctype.h与string.h中字符分类、长度计算、拷贝、比较等函数的使用要点,强调长度判断与越界风险,最后通过命令行待办事项示例整合fgets、sscanf、strncpy、strcmp,展示实际应用中的关键细节。

记录在学习过程中学到的知识 346

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 304

C++ 运行时多态与虚函数机制全面剖析【面试重点】

构成C++ 运行时多态必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且派生类必须对该虚函数完成重写/覆盖(Override)。只有基类的指针或引用才能既指向基类对象,又指向派生类对象(切片机制);而只有完成了虚函数重写,派生类与基类才具备不同的函数行为,达到“指向谁就调用谁”的效果。在类成员函数的前面加上virtual关键字修饰,该成员函数就成为了虚函数。public:// 成员函数前加 virtual 修饰,声明为虚函数。

Fuyo_0209的博客 437

#SQLite 数据库笔记一:(概念 / 终端指令 / SQL 语句 / C 编程 / 回调函数)

数据库 = 数据的仓库,假设数据是海量。能力说明存储数据持久化保存,程序退出数据还在统计数据、分组、排序数据管理增、删、改、查(CRUD)嵌入式设备上也会用数据库(单片机网关、路由器、工业 HMI 都常见),因为 sqlite 体积小、无需服务进程、单文件即可。数据库 = 库 > 表 > 记录(行) > 字段(列)sqlite3 = 开源、C 写的、单文件、免安装、最多 2T 的嵌入式关系型数据库。

lwq20051110的博客 210

C 语言 malloc() 详解与实战 Demo

本文详解C语言malloc()函数,涵盖其语法、内存原理及实战应用。通过动态整数、数组、结构体与链表的Demo,演示如何安全申请、使用与释放内存,强调避免内存泄漏与空指针检查的重要性,帮助开发者掌握动态内存管理核心技能。

tangPHP的博客 371

【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针

C++类与对象知识(面向过程和面向对象的初步认识,类的初步认识,类的访问限定符及封装,类的作用域、实例化,类的对象模型,this指针)

2601_96587588的博客 881

【C++ 基础入门】C++继承(下):问题、底层原理与组合

C++继承(菱形继承的问题、虚继承原理、继承与组合、构造顺序)

2601_96587588的博客 773

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 128

C++09_vector类复习

本文以10个核心问题为主线,系统解析C++ vector的底层机制:从基本概念、初始化方式、遍历方法,到size与capacity的区别、扩容策略(VS 1.5×,g++ 2×)、reserve与resize差异、中间增删的挪动原理、迭代器失效原因,直至二维vector的内存布局(含三指针结构)。通过“先会用、再懂扩容、最后看清对象结构”的递进逻辑,揭示vector作为动态数组的本质——连续内存、自动扩容、随机访问高效,但插入删除代价高,迭代器易失效。全文深入浅出,助读者摆脱“黑盒”认知,真正掌握其内存图景

lemo_n_的博客 337

825 mW 顶上 212 °C:ASM491S 的 105 °C/W、250 mA 短路电流与热关断

25 °C 环境里结温 34.1 °C,125 °C 环境里结温 134.1 °C——后者已经离 150 °C 只有 16 °C 了,但还在范围内。换个角度看同一件事:从 25 °C 和从 125 °C 起算,温升都是 86.6 °C,但一个到 111.6 °C(还在范围内),一个到 211.6 °C(远远超限)。这个算例里 20 °C/W 是我假设的,实际值取决于机壳材料、密封程度、有没有风扇,跨度可以从 5 °C/W 到 50 °C/W 以上。外面 50 °C 的机箱,盒内就是 63.9 °C。

ANSILIC的博客 338
上一篇: Codeforces Round 927 (Div. 3) D. Card Game 题解 贪心
下一篇: Codeforces Global Round 17 C. Keshi Is Throwing a Party 题解 二分答案
bbc_ouo
博客等级 码龄3年 2096粉丝 132原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值