【CF】Day62——Codeforces Round 948 (Div. 2) CD (思维 + LCM + 枚举因数 | 思维 + 哈希)

news2025/5/20 11:01:42

C. Nikita and LCM

题目:

思路:

非常好的思维题,顺便复习了一下快速枚举因数和lcm的性质

我们先来看答案的上界,即全选,此时说明 lcm(a1,a2,a3,...) > a_max 其中 a_max 为 a 中最大的数,那么如果答案不是 n 呢?

既然不是 n,也就是说如果我们全选的话这个数会出现在 a 中,而如果要出现在 a 中,显然这个数一定是 a_max

那么我们可以假设最后不在 a 中的 lcm 为 m,而根据 lcm 性质我们可以知道 子序列的lcm 肯定是整个序列lcm 的一个 因数 x,所以我们可以枚举 a_max 的因数,如果对于 a[i] 有 x % a[i] == 0,说明我们可以选 a[i], 然后快速枚举以及遍历一遍累加答案,最后取最大值即可,由于 n 是 2000,所以时间复杂度是可以接受的

特别注意,由于因子可能存在原数组,所以我们还要用 map 存储一下出现过的数字

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <memory>
using namespace std;
#define int long long
#define yes cout << "Yes\n"
#define no cout << "No\n"

int gcd(int a,int b)
{
    return !b ? a : gcd(b, a % b);
}

int lcm(int a,int b)
{
    return a * b / gcd(a,b);
}

void solve()
{
    int n;
    cin >> n;
    vector<int> a(n);
    map<int, int> mp;
    int LCM = 1,mx=0;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
        mp[a[i]]++;
        mx = max(mx, a[i]);
    }
    for (int i = 0; i < n; i++)
    {
        LCM = lcm(LCM, a[i]);
        if (LCM > mx)
        {
            cout << n << endl;
            return;
        }
    }
    vector<pair<int, int>> b;
    for (auto& x : mp)
        b.push_back(x);

    auto fuc = [&](int x) ->int{
        int Lcm = 0, cnt = 0;
        for (auto& son : b)
        {
            if (x % son.first == 0)
            {
                cnt += son.second;
                if (Lcm == 0)
                    Lcm = son.first;
                else
                    Lcm = lcm(Lcm, son.first);
            }
        }
        if (Lcm != x)cnt = 0;
        return cnt;
        };

    int res = 0;
    for (int i = 1; i*i <= mx; i++)
    {
        if (mx % i == 0)
        {
            if (!mp[i])
                res = max(res, fuc(i));
            if (!mp[mx/i])
                res = max(res, fuc(mx/i));
        }
    }
    cout << res << endl;
}

signed main()
{
    cin.tie(0)->sync_with_stdio(false);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

D. XORificator

题目:

 

 

思路:

无敌哈希运用,学到了新的想法,值得反复观看

题目告诉我们可以使用操作使得每一行的 0/1 翻转,然后问我们在所有的操作可能中最后最多有多少个特殊列,其中特殊列为该列中只有一个 1

我们首先发现,好像除了暴力枚举没啥法子能做了?事实上确实是这样,所以我们得想想怎么优化比较好

我们发现,如果我们钦定某个 (i,j) 为 1,那么全局情况就唯一了,那我们可以枚举每一个点,如果要让他变成这一列唯一的 1 我们要怎么操作,然后把操作存储下来,而这个操作每一次只有变换或者不变换,即可以看作一个 01 串,那我们就可以使用字符串哈希的类似方法来处理

具体的,我们先获取如果要让这一列全变成 0 要执行什么操作,然后枚举每一位让他取反,这样我们就知道如果要只让他为 1 的操作是什么呢,那么如何储存哈希值呢?我们为了防止哈希冲突,我们可以使用双哈希,我们定义执行操作为取这一点的哈希,这样我们就能获得对应的两个哈希了,然后我们用一个 map 存储对应操作的答案,这样后续遇到相同的哈希值(即相同的操作时)我们就知道谁的答案最大了,同时我们还要储存此时是让哪个 (i,j) 为 1,这样便于我们输出答案

具体实现看代码,还是有点细节的,注意哈希值这里是随机数,这样不容易被数据仙人卡

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <memory>
#include <random>
#include <ctime>
using namespace std;
#define int long long
#define yes cout << "Yes\n"
#define no cout << "No\n"
mt19937_64 rnd(time(0));
void solve()
{
    int n, m;
    cin >> n >> m;
    vector<string> ma(n);
    for (int i = 0; i < n; i++)
    {
        cin >> ma[i];
    }
    vector<int> hash1(n), hash2(n);
    for (int i = 0; i < n; i++)
    {
        hash1[i] = rnd(), hash2[i] = rnd();
    }
    map<pair<int, int>, int> hash;
    int res = 0;
    pair<int, int> point = { 0,0 };
    for (int j = 0; j < m; j++)
    {
        int h1 = 0, h2 = 0;
        //计算将这一列全变成 0 的操作的哈希值
        for (int i = 0; i < n; i++)
        {
            if (ma[i][j] == '1')
                h1 ^= hash1[i], h2 ^= hash2[i];
        }
        for (int i = 0; i < n; i++)
        {
            //如果第 i 行的为 1 的操作的哈希值
            h1 ^= hash1[i], h2 ^= hash2[i];
            hash[{h1, h2}]++;
            if (res < hash[{h1, h2}])
            {
                res = hash[{h1, h2}];
                point = { i,j };
            }
            //变回全是 0 的哈希值
            h1 ^= hash1[i], h2 ^= hash2[i];
        }
    }
    cout << res << endl;
    for (int i = 0; i < n; i++)
    {
        if (ma[i][point.second] == '1')
            cout << (i != point.first);
        else
            cout << (i == point.first);
    }
    cout << endl;
}

signed main()
{
    cin.tie(0)->sync_with_stdio(false);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2379921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于requests_html的python爬虫

前言&#xff1a;今天介绍一个相对性能更高的爬虫库requests_html&#xff0c;会不会感觉和requests有点联系&#xff1f;是的。为什么开始不直接介绍呢&#xff1f;因为我觉得requests是最基本入门的东西&#xff0c;并且在学习过程中也能学到很多东西。我的python老师在介绍这…

STM32:按键模块 传感器模块 以及 相关C语言知识(详细讲解)

目录 按键 传感器模块 C语言知识 C语言数据类型 C语言宏定义 C语言typedef C语言结构体 C语言枚举 按键 常见的输入设备&#xff0c;按下导通&#xff0c;松手断开 按键抖动&#xff1a;由于按键内部使用的是机械式弹簧片来进行通断的&#xff0c;所以在按下和松手的瞬…

C++23 std::mdspan:多维数组处理新利器

文章目录 引言C23简介std::mdspan的定义与特点定义特点 std::mdspan的优势零成本抽象的多维数据访问减少内存开销提高代码灵活性 std::mdspan的应用场景科学计算图形学 相关提案示例代码使用动态扩展使用静态和动态扩展 总结 引言 在C的发展历程中&#xff0c;每一个新版本都带…

基于高德MCP2.0的智能旅游攻略系统设计与实现

前言&#xff1a;旅游规划的技术革命 在数字化旅游时代&#xff0c;MCP2.0&#xff08;Map-based Collaborative Planning&#xff09;系统代表着旅游攻略技术的最新演进。作为对1.0版本的全面升级&#xff0c;MCP2.0通过深度整合高德地图API和智能算法&#xff0c;实现了从静…

【时时三省】(C语言基础)用函数实现模块化程序设计

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 为什么要用函数&#xff1f; 已经能够编写一些简单的C程序&#xff0c;但是如果程序的功能比较多&#xff0c;规模比较大&#xff0c;把所有的程序代码都写在一个主函数(main函数)中&#x…

Flink流处理:实时计算URL访问量TopN(基于时间窗口)

目录 代码分析 背景知识拓展 代码调优 1. 性能优化 1.1 使用 KeyedStream 和 ProcessWindowFunction 替代 windowAll 1.2 使用 ReduceFunction 优化聚合 2. 功能扩展 2.1 支持动态窗口大小 2.2 支持多维度统计 2.3 支持持久化存储 3. 代码可读性 3.1 提取公共逻辑 …

华为OD机试真题——考勤信息(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

Go语言测试用例的执行与分析

在软件开发过程中&#xff0c;测试用例是确保代码质量的关键环节。Go语言作为一种现代的编程语言&#xff0c;它内置了强大的测试框架&#xff0c;可以帮助开发者轻松编写和执行测试用例。本文将介绍如何在 Go 语言中编写、执行测试用例&#xff0c;并对测试结果进行分析。 ## …

MyBatis:动态SQL

文章目录 动态SQLif标签trim标签where标签set标签foreach标签include标签和sql标签 Mybatis动态SQL的官方文档&#xff1a; https://mybatis.net.cn/dynamic-sql.html 动态SQL 动态SQL是 MyBatis的强大特性之一,如果是使用JDBC根据不同条件拼接sql很麻烦&#xff0c;例如拼接…

游戏引擎学习第280天:精简化的流式实体sim

回顾并为今天的内容做铺垫 今天的任务是让之前关于实体存储方式的改动真正运行起来。我们现在希望让实体系统变得更加真实和实用&#xff0c;能够支撑我们游戏实际所需的功能。这就要求我们对它进行更合理的实现和调试。 昨天我们基本让代码编译通过了&#xff0c;但实际上还…

王树森推荐系统公开课 排序03:预估分数融合

融合预估分数 p c l i c k ⋅ p l i k e p_{click} \cdot p_{like} pclick​⋅plike​ 有实际意义&#xff0c;等于在曝光中点赞的概率。 p c l i c k ⋅ p c o l l e c t p_{click} \cdot p_{collect} pclick​⋅pcollect​ 同理。 按多种排名做 ensemble sort。 某电商的融…

网络I/O学习-poll(三)

一、为什么要用Poll 由于select参数太多&#xff0c;较于复杂&#xff0c;调用起来较为麻烦&#xff1b;poll对其进行了优化 二、poll机制 poll也是一个系统调用&#xff0c;每次调用都会将所有客户端的fd拷贝到内核空间&#xff0c;然后进行轮询&#xff0c;判断IO是否就绪…

k8s(12) — 版本控制和滚动更新(金丝雀部署理念)

金丝雀部署简介&#xff1a; 1、基本概念 金丝雀部署是一种软件开发中的渐进式发布策略&#xff0c;其核心思想是通过将新版本应用逐步发布给一小部分用户&#xff08;即 “金丝雀” 用户&#xff09;&#xff0c;在真实环境中验证功能稳定性和性能表现&#xff0c;再逐步扩大发…

Google设置app-ads.txt

问题&#xff1a; 应用上架后admob后台显示应用广告投放量受限&#xff0c;需要设置app-ads.txt才行。 如何解决&#xff1a; 官方教程: 看了下感觉不难&#xff0c;创建一个txt&#xff0c;将第二条的代码复制进行就得到app-ads.txt了。 然后就是要把这个txt放到哪才可以…

docker安装rockerMQ

参考Docker部署RocketMQ5.x (单机部署配置参数详解不使用docker-compose直接部署)_rocketmq不推荐用docker部署-CSDN博客 镜像拉取 镜像地址&#xff1a; https://hub.docker.com/r/apache/rocketmq/tags 我在部署的时候最新发行版是5.1.0可以根据需求自行选择一个5.x的版本&a…

交叉引用、多个参考文献插入、跨文献插入word/wps中之【插入[1-3]、连续文献】

我们在写论文时&#xff0c;需要插入大量参考文献。 有时&#xff0c;一句话需要引用多个文献&#xff0c;如&#xff1a;[1-3]或者[1,3,4]这种形式多个文献插入、跨文献插入。 在上一篇文章中&#xff0c;我们提到可以直接打“-”或者“&#xff0c;”&#xff0c;但是word导出…

PLC双人舞:profinet转ethernet ip网关奏响施耐德与AB的协奏曲

PLC双人舞&#xff1a;ethernet ip转profinet网关奏响施耐德与AB的协奏曲 案例分析&#xff1a;施耐德PLC与AB PLC的互联互通 在现代工业自动化中&#xff0c;设备之间的互联互通至关重要。本案例旨在展示如何通过北京倍讯科技的EtherNet/IP转Modbus网关&#xff0c;将施耐德P…

缺乏团队建设活动,如何增强凝聚力?

当一个团队缺乏系统性的建设活动时&#xff0c;成员之间容易产生疏离感、误解与信任缺失&#xff0c;最终影响整体执行力和目标达成。要有效增强团队凝聚力&#xff0c;应从设计高参与感的团队活动、结合业务与人文目标、营造持续共创的文化机制、推动跨层级协作互动等层面着手…

力扣HOT100之二叉树:230. 二叉搜索树中第 K 小的元素

这道题直接用最笨的办法来做的&#xff0c;用递归来做&#xff0c;我们定义一个全局变量vector<int> element&#xff0c;然后使用中序遍历&#xff0c;每当碰到一个非空节点就将其加入到向量中&#xff0c;这样依赖当向量中的元素小于k时&#xff0c;就返回0&#xff0c…

Linux面试题集合(5)

把文件1的内容追加到文件2 cat 文件1>>文件2 把文件1和文件2合并成文件3 cat 文件1 文件2>文件3 使用less查看文件时&#xff0c;搜寻ab字符 /ab 用more和less如何查看文件 more&#xff1a; CtrlF -- 向下滚动一屏 CtrlB -- 返回上一屏 f -- 向下翻屏 b -- 向上翻屏 …