Codeforces Round 949 D. Turtle and Multiplication 【欧拉路径】

D

题意

要求构造一个长度为 n n n 的序列 a a a,使得:

  • ∀ i ∈ [ 1 , n ] ,    1 ≤ a i ≤ 3 ⋅ 1 0 5 \forall i \in [1,n], \; 1 \leq a_i \leq 3 \cdot 10^5 i[1,n],1ai3105
  • ∀ 1 ≤ i < j ≤ n − 1 ,    a i ⋅ a i + 1 ≠ a j ⋅ a j + 1 \forall 1 \leq i < j \leq n - 1, \; a_i \cdot a_{i + 1} \neq a_j \cdot a_{j + 1} ∀1i<jn1,aiai+1=ajaj+1
    要求最终序列中数字的种类最少
思路

不难发现,所有的数字选用质数一定最优,因为这样可以保证: a i ⋅ a i + 1 = a j ⋅ a j + 1 ⇔ ( a i , a i + 1 ) = ( a j , a j + 1 ) a_i \cdot a_{i + 1} = a_j \cdot a_{j + 1} \Lrarr (a_i, a_{i + 1}) = (a_j, a_{j + 1}) aiai+1=ajaj+1(ai,ai+1)=(aj,aj+1)

那么我们只需要保证每一对无序对 ( a i , a i + 1 ) (a_i, a_{i + 1}) (ai,ai+1) 均不同即可。

这里可以建模成一张图:以每一个为顶点,边表示无序对(即相邻的数),每一个点还有一个自环(表示 ( a i , a i ) (a_i, a_i) (ai,ai)这样的无序对)

那么问题就转化为了,我们要选择最少的顶点数量,使得 无向完全图 中存在一条长度至少为 n − 1 n - 1 n1,且不经过重复边的路径。

如果图上点数已经确定,考虑如何计算最长欧拉路径的长度:

  1. 如果 n n n奇数,那么每个点的度数是 n − 1 + 2 = n + 1 n - 1 + 2 = n + 1 n1+2=n+1 为偶数,存在欧拉回路,因此最长欧拉路径的长度即为: C n 2 + n = ( n + 1 ) ⋅ n 2 C_n ^ 2 + n = \dfrac{ (n + 1) \cdot n}{2} Cn2+n=2(n+1)n
  2. 如果 n n n偶数,那么每个点的度数就是奇数了,我们要考虑如何删去最少的边,使得图上恰好剩余 2 2 2 个奇度顶点,这样子就存在最长的欧拉路径;观察发现:删去一条边最多可以影响 2 2 2 个点的度数,因此保留两个奇度顶点最少需要删除: n − 2 2 \dfrac{n - 2}{2} 2n2 条边。我们可以删除 ( 2 , 3 ) ,    ( 4 , 5 ) ,    . . .    , ( n − 2 , n − 1 ) (2, 3), \; (4,5), \; ... \;, (n - 2, n - 1) (2,3),(4,5),...,(n2,n1) 这些边,这样子 1 1 1 号点就是奇度顶点,我们可以直接从 1 1 1 开始 d f s dfs dfs

最后我们只需要二分找到边数足够的 n n n,在上面跑一个欧拉路径即可

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;

const int INF=0x3f3f3f3f;
const long long INFLL=1e18;

typedef long long ll;

std::vector<int> minp;
std::vector<int> primes;

void sieve(int n){
    minp.assign(n + 5, 0);
    primes.clear();

    fore(i, 2, n + 1){
        if(!minp[i]){
            minp[i] = i;
            primes.push_back(i);
        }
        for(auto p : primes){
            if(p * i > n) break;
            minp[i * p] = p;
            if(minp[i] == p) break;
        }
    }
}

const int N = 2000005;

std::vector<int> stk;
bool vis[N];
std::vector<std::pair<int, int>> g[10005];

void dfs(int u){
    for(auto [v, id] : g[u])
        if(!vis[id]){
            vis[id] = true;
            dfs(v);
        }
    stk.push_back(primes[u]);
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);

    sieve(N);

    int t;
    std::cin >> t;
    while(t--){
        int n;
        std::cin >> n;

        auto check = [](int x, int n) -> bool {
            if(x & 1) return x * (x - 1) / 2 + x >= n - 1;
            return x * (x - 1) / 2 - (x - 2) / 2 + x >= n - 1;
        };

        int num = 0;
        int l = 1, r = 10000;
        while(l <= r){
            int mid = l + r >> 1;
            if(check(mid, n)){
                num = mid;
                r = mid - 1;
            }
            else l = mid + 1;
        }

        fore(u, 0, num) g[u].clear();

        int tot = 0;
        fore(i, 0, num)
            fore(j, i, num){
                if(num % 2 == 0 && (i & 1) && j == i + 1) continue; //偶数个点时,去掉一些边构造欧拉路径
                g[i].push_back({j, ++tot});
                g[j].push_back({i, tot});
            }
        
        fore(i, 0, tot + 1) vis[i] = false;
        stk.clear();
        dfs(0);
        std::reverse(ALL(stk));

        fore(i, 0, n) std::cout << stk[i] << " \n"[i == n -1];
    }

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java筑基-面向对象

Java-面向对象 一、类和对象1、类和对象的关系2、创建类3、创建对象4、成员变量与局部变量5、构造器5.1、创建对象的过程5.2、构造器的格式5.3、构造器和方法的区别5.4、构造器的作用5.5、构造器的重载 6、this关键字用法&#xff1a;6.1、this可以修饰属性6.2、this可以修饰方…

每日一题——Python实现PAT甲级1046 Shortest Distance(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 专业点评 优点 改进建议 时间复杂度分析 空间复杂度分析 总结 我要更…

第一篇【传奇开心果系列】AI工业应用经典算法和Python示例:基于AI的智能制造技术经典算法与Python实践

传奇开心果博文系列 系列博文目录AI工业应用经典算法和Python示例系列 博文目录前言一、AI在智能制造方面的应用场景介绍二、基于AI的智能制造技术经典算法介绍三、支持向量机机器学习算法Python示例代码四、随机森林机器学习算法Python示例代码五、深度学习算法Python示例代码…

HTML5常用标签表单from

form表单标签 <!-- form表单其实就是一种&#xff1a;客户端和服务端数据交流一种方式机制。1&#xff1a; 服务端&#xff0c;提供数据接受地址&#xff08;gin/beego/inris&#xff09;比如&#xff1a;http://localhost:8080/toLogin2: 因为浏览器&#xff0c;在提交数据…

sql server数据库连接不上

我遇到了一个问题&#xff0c;本地sql server怎么都连接不了 我按照网上的方法都试了一遍&#xff0c;发现都错了 后来我把tcp/ip禁用了就好了 或者说把tcp/ip改成动态端口 之后需要重启sql server&#xff0c;右键选中的地方&#xff0c;重启

C++ 左值、右值、左值引用、右值引用

前言 本文介绍C11的各种引用的概念&#xff0c;理解清楚各种引用的概念&#xff0c;非常有助于理解基于c11引用的各种操作。 左右值概念 C 里有左值和右值&#xff0c;但C按标准里的定义实际更复杂&#xff0c;规定了下面这些值类别&#xff08;value categories&#xff09…

使用busybox快速创建rootfs系统(硬件:atk-dl6y2c)

目录 概述 1 编译busybox 1.1 配置Makefile 1.2 需改参数 1.3 配置busybox 1.4 编译busybox 2 完善 rootfs下文件 2.1 rootfs 的“/lib”目录添加库文件 2.2 rootfs 的“usr/lib”目录添加库文件 2.3 创建其他目录 3 完善其他文件 3.1 完善etc/init.d/rcS 3.2 完善…

11.4 插入排序

目录 11.4 插入排序 11.4.1 算法流程 11.4.2 算法特性 11.4.3 插入排序的优势 11.4 插入排序 插入排序&#xff08;insertion sort&#xff09;是一种简单的排序算法&#xff0c;它的工作原理与手动整理一副牌的过程非常相似。 具体来说&#xff0c;我们在未排…

片上电控系统集成技术

一、背景 片上电机控制系统集成技术&#xff08;On-Chip Motor Control System Integration&#xff09;是一种先进的电子工程技术&#xff0c;它主要聚焦于将复杂的电机控制算法和硬件组件整合到单一集成电路&#xff08;IC&#xff09;中&#xff0c;以便于高效、精确地管理…

C基础-标准库下

上:http://t.csdnimg.cn/qj5uA 目录 七. math.h 八. setjmp.h 九. signal.h 十. stdarg.h 十一.stddef.h 十二. stdio.h 十三. stdlib. 十四. string.h 十五. time.h 七. math.h 定义了各种数学函数和一个宏。 宏和函数描述 序号宏 & 描述1HUGE_VAL 当函数的结…

C++11 lambda表达式和包装器

C11 lambda表达式和包装器 一.lambda表达式1.lambda表达式的引入2.基本语法和使用1.基本语法2.使用1.传值捕捉的错误之处2.传引用捕捉 3.lambda表达式的底层原理4.lambda的特殊之处5.lambda配合decltype的新玩法 二.function包装器1.概念2.包装函数1.包装普通函数2.包装成员函数…

【Oracle篇】rman全库异机恢复:从RAC环境到单机测试环境的转移(第四篇,总共八篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

odoo10 编写审批拒绝弹窗

前言 在日常中有很多审批场景&#xff0c;例如请销假。审批拒绝的时候应该给出原因&#xff0c;此时&#xff0c;在form界面点击拒绝的时候应该弹出输入窗口。如下图所示。 编写模型 模块的目录下&#xff0c;新建wizard文件夹&#xff0c;然后直接创建一个models.py和views.p…

idea实用快捷键(持续更新...)

文章目录 1、快速输入try/catch/finally2、选中多个光标3、实现接口4、方法参数提示5、查看某个类的子类6、弹出显示查找内容的搜索框 1、快速输入try/catch/finally CtrlAltT 2、选中多个光标 ShiftAlt单机多选 End可以全部到行尾&#xff0c;Home则可以全部回到行首 3、实现接…

MySQL 使用方法以及教程

一、引言 MySQL是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛应用于Web开发、数据分析等领域。它提供了高效、稳定的数据存储和查询功能。同时&#xff0c;Python作为一种强大的编程语言&#xff0c;也提供了多种与MySQL交互的库&#…

中国人工智能区域竞争力研究报告(2024)

来源&#xff1a;赛迪顾问 近期历史回顾&#xff1a;2024年NoETL开启自动化数据管理新时代白皮书.pdf 创新引领用户“换新生活”-从AWE2024看家电及消费电子行业发展趋势报告&#xff08;精简版&#xff09;.pdf 2024智能网联汽车“车路云一体化”规模建设与应用参考指南&#…

字节裁员!开启裁员新模式。。

最近&#xff0c;互联网圈不太平&#xff0c;裁员消息此起彼伏。而一向以“狼性文化”著称的字节跳动&#xff0c;却玩起了“低调裁员”&#xff0c;用一种近乎“温柔”的方式&#xff0c;慢慢挤掉“冗余”的员工。 “细水长流”&#xff1a;裁员新模式&#xff1f; 不同于以往…

FreeRTOS基础(九):FreeRTOS的列表和列表项

今天我们将探讨FreeRTOS中的一个核心概念——列表&#xff08;List&#xff09;和列表项&#xff08;List Item&#xff09;。在实时操作系统&#xff08;RTOS&#xff09;中&#xff0c;任务的管理和调度是至关重要的&#xff0c;而FreeRTOS使用列表来实现这一功能。列表可以说…

城市低空经济“链接力”指数报告(2024)

来源&#xff1a;城市进化论&火石创造 近期历史回顾&#xff1a;2024年NoETL开启自动化数据管理新时代白皮书.pdf 创新引领用户“换新生活”-从AWE2024看家电及消费电子行业发展趋势报告&#xff08;精简版&#xff09;.pdf 2024智能网联汽车“车路云一体化”规模建设与应用…

鬼刀画风扁平化粒子炫动引导页美化版

源码介绍 分享一款引导页,响应式布局&#xff0c;支持移动PC 添加背景图片&#xff0c;美化高斯模糊 &#xff0c;删除蒙版人物部分&#xff0c;更图片人物画风更美好 删除雪花特效 替换字体颜色 添加底备案号 预留友情连接 效果预览 源码下载 https://www.qqmu.com/3381.h…