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

2023NOIP A层联测17 黑暗料理

题目大意

给出一个长度为 n n n的序列 a i a_i ai,要求删去若干个数,使得剩下的数中任意两个数都不是质数。在满足条件的情况下最多能保留几个数。

T T T组数据。

1 ≤ T ≤ 4 , 1 ≤ n ≤ 750 , 1 ≤ a i ≤ 1 0 9 1\leq T\leq 4,1\leq n\leq 750,1\leq a_i\leq 10^9 1T4,1n750,1ai109

时间限制 2000 m s 2000ms 2000ms,空间限制 512 M B 512MB 512MB


题解

首先,如果一个数 k k k不是质数,那一定 k k k存在一个质因数 p p p满足 p ≤ k p\leq \sqrt k pk

那么,我们可以预处理出 5 × 1 0 4 5\times 10^4 5×104以内的所有质数,用这些质数即可判断 2 × 1 0 9 2\times 10^9 2×109以内的每个数是不是质数。若枚举每两个数来判断是不是质数,则时间复杂度是 O ( n 2 P ) O(n^2P) O(n2P)的(其中 P P P 5 × 1 0 4 5\times 10^4 5×104以内的质数个数, P = 5133 P=5133 P=5133)。

我们考虑优化。对于每个质数 p p p,令 b i = a i % p b_i=a_i\% p bi=ai%p,然后将 b i b_i bi排序,那么此时 b i b_i bi由若干个值相同的部分组成。假设有一部分的值都为 x x x,则我们需要找到值都为 p − x p-x px的部分,则枚举这两部分的 a a a值。设第一部分枚举到 a i a_i ai,第二部分枚举到 a j a_j aj,则如果 a i + a j > p a_i+a_j>p ai+aj>p,则 a i + a j a_i+a_j ai+aj一定是 p p p的若干倍,那么其一定是合数,做一个标记。

你可能会问:对于每个质数,最多有可能标记 n 2 n^2 n2次,那时间复杂度不还是 O ( n 2 P ) O(n^2P) O(n2P)吗?

对于每个 a i + a j a_i+a_j ai+aj,它只会被它的质因数打标记,而 a i + a j a_i+a_j ai+aj的质因数最多为 log ⁡ ( a i + a j ) \log(a_i+a_j) log(ai+aj)个,所以平摊下来,时间复杂度为 O ( n 2 log ⁡ v ) O(n^2\log v) O(n2logv),其中 v v v a i + a j a_i+a_j ai+aj的最大值。枚举的时间复杂度为 O ( n P ) O(nP) O(nP),所以这部分的时间复杂度为 O ( n 2 log ⁡ v + n P ) O(n^2\log v+nP) O(n2logv+nP)

当然,也可以用用 Miller-Rabin \text{Miller-Rabin} Miller-Rabin算法来判断 a i + a j a_i+a_j ai+aj是不是质数。

知道了每两个数之和是否为质数之后,我们建一个图,对于和为质数的两个数,我们将这两个数在图上对应的点连一条边,那么题意就是求最大点独立集。

我们观察图的性质。

如果组成的质数为偶质数,那么这个质数一定为 2 2 2,组成它的两个 a a a值一定都为 1 1 1。也就是说,在所有 a i a_i ai中只保留最多一个 1 1 1,即可保证不会出现偶质数。这个在输入的时候特殊处理一下即可。

那么, a i + a j a_i+a_j ai+aj为质数的话,只可能为奇质数,那么 a i a_i ai a j a_j aj的奇偶性一定不同。于是,上面的图就是一个二分图了。二分图的最大点独立集等于二分图的顶点数减去二分图的最大匹配数,那我们只需要求这个二分图的最大匹配即可。

这个二分图的点数为 n n n,边数为 m = n 2 m=n^2 m=n2。我们可以用匈牙利算法来求二分图的最大匹配,时间复杂度为 O ( n m ) O(nm) O(nm),即 O ( n 3 ) O(n^3) O(n3)。感觉会 TLE \text{TLE} TLE,但是匈牙利的时间复杂度为点数乘边数。设左边的点数为 x x x,则最坏情况下要做的次数为 n ⋅ x ( n − x ) n\cdot x(n-x) nx(nx),最大值为 n 3 4 \dfrac{n^3}{4} 4n3,而这是跑不满的。所以用匈牙利算法是可行的。

当然,也可以用 Dinic \text{Dinic} Dinic算法来求二分图的最大匹配,时间复杂度为 O ( n m ) O(n\sqrt m) O(nm ),即 O ( n 2 ) O(n^2) O(n2)

求完最大匹配之后,用点数减去最大匹配即可得到这个图的最大点独立集,也就是答案。

时间复杂度为 O ( ∑ ( n 2 log ⁡ v + n P + n 3 ) ) O(\sum(n^2\log v+nP+n^3)) O((n2logv+nP+n3)),其中 n 3 n^3 n3是带一个 1 4 \dfrac 14 41的常数的,而且这跑不满,时限还给了 2000 m s 2000ms 2000ms,所以这是可以过的。

code

#include<bits/stdc++.h>
using namespace std;
const int N=750,P=50000;
int T,n,p1,p2,q1,q2,ans,a[N+5],p[P+5],z[P+5],gt[N+5],t[N+5][N+5];
int tot,d[2*N*N+5],l[2*N*N+5],r[N+5],cx[N+5],cy[N+5];
struct node{int x,id;
}b[N+5];
bool cmp(node ax,node bx){return ax.x<bx.x;
}
void add(int xx,int yy){l[++tot]=r[xx];d[tot]=yy;r[xx]=tot;
}
void init(){for(int i=2;i<=P;i++){if(!z[i]) p[++p[0]]=i;for(int j=1;j<=p[0]&&i*p[j]<=P;j++){z[i*p[j]]=1;if(i%p[j]==0) break;}}
}
int dfs(int u){for(int i=r[u];i;i=l[i]){if(gt[d[i]]) continue;gt[d[i]]=1;if(!cy[d[i]]||dfs(cy[d[i]])){cx[u]=d[i];cy[d[i]]=u;return 1;}}return 0;
}
int main()
{
//	freopen("cooking.in","r",stdin);
//	freopen("cooking.out","w",stdout);init();scanf("%d",&T);while(T--){scanf("%d",&n);tot=0;memset(r,0,sizeof(r));memset(t,0,sizeof(t));for(int i=1,bz=0;i<=n;i++){scanf("%d",&a[i]);if(a[i]==1){if(!bz) bz=1;else{--i;--n;continue;}}t[i][i]=1;}for(int nw=1;nw<=p[0];nw++){for(int i=1;i<=n;i++) b[i]=(node){a[i]%p[nw],i};sort(b+1,b+n+1,cmp);p1=p2=1;q1=q2=n;for(;p2<=n&&b[p2].x==0;p2++){for(int i=p1;i<=p2;i++){int w1=b[i].id,w2=b[p2].id;t[w1][w2]=t[w2][w1]=1;}}--p2;p1=p2+1;for(;;p1=p2+1,q1=q2-1){while(p1<=n&&q1>=1&&b[p1].x+b[q1].x!=p[nw]){if(b[p1].x+b[q1].x<p[nw]) ++p1;else --q1;}if(p1>n||q1<1||p1>q1) break;p2=p1;q2=q1;while(p2+1<=n&&b[p2+1].x==b[p1].x) ++p2;while(q2-1>=1&&b[q2-1].x==b[q1].x) --q2;for(int i=p1;i<=p2;i++){for(int j=q2;j<=q1;j++){int w1=b[i].id,w2=b[j].id;if(a[w1]+a[w2]>p[nw]) t[w1][w2]=t[w2][w1]=1;}}}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(!t[i][j]) add(i,j);}}ans=n;memset(cx,0,sizeof(cx));memset(cy,0,sizeof(cy));for(int i=1;i<=n;i++){if(a[i]%2==0) continue;if(!cx[i]){memset(gt,0,sizeof(gt));ans-=dfs(i);}}printf("%d\n",ans);}return 0;
}

相关文章:

2023NOIP A层联测17 黑暗料理

题目大意 给出一个长度为 n n n的序列 a i a_i ai​&#xff0c;要求删去若干个数&#xff0c;使得剩下的数中任意两个数都不是质数。在满足条件的情况下最多能保留几个数。 有 T T T组数据。 1 ≤ T ≤ 4 , 1 ≤ n ≤ 750 , 1 ≤ a i ≤ 1 0 9 1\leq T\leq 4,1\leq n\leq 75…...

关于nacos的配置获取失败及服务发现问题的排坑记录

nacos配置更新未能获取到导致启动报错 排查思路&#xff1a; 1、是否添加了nacos的启动pom依赖 参考&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><…...

【QT】其他常用控件1

新建项目 scrollArea 滚动 toolBox 插入 tabWidget stackedWidget 切换 索引是0 运行后&#xff0c;没有切换按钮&#xff0c;结合pushbutton&#xff0c;加两个Button 代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent)…...

交换机/防火墙-基础配置-23.10.11

update 优化了目录逻辑 -10.24.2023 一.前置知识 1.MAC地址 交换机在给主机之间传递信息包时&#xff0c;通过MAC地址来标识每台主机 主机间发生信息包交换时&#xff0c;交换机就会将通信过的主机的mac地址存下 dis mac-address 交换机转发的数据包中&#xff0c;会包含一…...

alibaba.fastjson的使用(四)-- Json字符 与 JsonObject 的相互转化

目录 1. Json字符串转JsonObject 2. JsonObject转Json字符串 1. Json字符串转JsonObject 使用到的方法1: static JSONObject parseObject(String text) 使用到的方法2: public String getString(String key) /*** 将Json字符串转为JsonObject对象* 取值不存在时,返回null…...

linux 主机通信 ipv6 配置

1.检查系统内核是否支持IPv6协议&#xff1a; 在Linux控制台中运行下列命令&#xff1a; cat /proc/sys/net/ipv6/conf/all/disable_ipv6如果返回结果是0&#xff0c;就表明系统支持IPv6协议&#xff1b;若是1&#xff0c;则表明系统目前不支持IPv6协议&#xff1b; 2.禁用I…...

【JavaEE】初识计算机网络(TCP/IP五层模型及封装和分用)

一、 网络通信基础 网络互连的目的是进行网络通信&#xff0c;也即是网络数据传输&#xff0c;更具体一点&#xff0c;是网络主机中的不同进程间&#xff0c;基于网络传输数据。 那么&#xff0c;在组建的网络中&#xff0c;如何判断到底是从哪台主机&#xff0c;将数据传输到…...

在nodejs中实现实时通信的几种方式

在nodejs中实现实时通信的几种方式 在当今世界中&#xff0c;实时通信至关重要。无论是聊天应用程序还是实时体育更新&#xff0c;实时通信都是保持用户活跃度所必需的。Node.js 因其速度、可扩展性和可靠性而成为开发实时应用程序的流行工具。在本文中&#xff0c;我们将探讨…...

【tg】 7 GroupInstanceCustomImpl

group GroupInstanceCustomImpl 核心GroupInstanceCustomInternal G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\group\GroupInstanceCustomImpl.h 最核心是是GroupInstanceCustomInternal: private:std::shared_ptr<Threads> _threads;std::u…...

kubernates 集群实战-安装K3s集群

安装K3s集群 安装K3s集群环境准备安装 docker主节点安装work 节点验证环境 安装K3s集群 K3S是一种轻量级的Kubernetes发行版&#xff0c;安装和运行只需要一个二进制文件。相比之下&#xff0c;K8S需要更多的步骤和资源来安装和部署&#xff0c;例如设置etcd集群、安装控制平面…...

通俗介绍:什么是 Redis ?

刚接触 Redis 的伙伴们可能会因为不熟悉而感到困惑。本文简述 Redis 是什么、有哪些作用的问题&#xff0c;是一篇短浅而入门级别的文章。 Redis官网&#xff1a;Redis 打开 Redis 官网可以看到&#xff0c;官方对 Redis 的介绍是这样的&#xff1a;The open source, in-memo…...

蓝桥算法赛(摆玩具)

问题描述 小蓝是一个热爱收集玩具的小伙子&#xff0c;他拥有 n 个不同的玩具。 这天&#xff0c;他把 n 个玩具按照高度顺序从矮到高摆放在了窗台上&#xff0c;然后&#xff0c;他希望将这些玩具分成 k 个段&#xff0c;使得所有分段的极差之和尽可能小。 具体来说&…...

vueDay04——v-if else show

一、v-if的使用 我们可以像c语言一样去使用v-if结构 比如单用v-if&#xff0c;连用v-if v-else&#xff0c;或者是v-if v-else-if v-else 注意&#xff1a; 1.v-if v-else-if需要绑定值,而v-else不需要绑定值 2.if结构可以用在不同的标签类型之间 <div v-if"fir…...

大数据技术学习笔记(二)—— Hadoop 运行环境的搭建

目录 1 准备模版虚拟机hadoop1001.1 修改主机名1.2 修改hosts文件1.3 修改IP地址1.3.1 查看网络IP和网关1.3.2 修改IP地址 1.4 关闭防火墙1.5 创建普通用户1.6 创建所需目录1.7 卸载虚拟机自带的open JDK1.8 重启虚拟机 2 克隆虚拟机3 在hadoop101上安装JDK3.1 传输安装包并解压…...

leetcode系列(双语)002——GO两数相加

文章目录 两数相加 | Add Two Numbers示例个人解答官方解答扩展Algorithm 两数相加 | Add Two Numbers You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a sing…...

废柴勇士(据说没有人能坚持37秒)

欢迎来到程序小院 废柴勇士 玩法&#xff1a;点击屏幕下方左右按键击杀怪物&#xff0c;怪物会在左右方向同时来袭&#xff0c;快速点击按钮进行击杀怪物&#xff0c;看您能够坚持多少秒&#xff0c; 据说还没有能够坚持37秒&#xff0c;快去击杀怪物挑战吧^^。开始游戏https:…...

buuctf_练[羊城杯2020]easyphp

[羊城杯2020]easyphp 文章目录 [羊城杯2020]easyphp掌握知识解题思路关键paylaod 掌握知识 ​ .htaccess文件的利用&#xff0c;把自己指定当做 php文件处理&#xff1b;preg_match正则匹配的了解&#xff0c;stristr函数的绕过&#xff1b;file_put_contents文件写入操作的了…...

【Linux】安装配置虚拟机及虚拟机操作系统的安装

目录 一、操作系统 1. 介绍 2. 功能 3. 有哪些 4. 个人版本和服务器版本的区别 二、VMWare虚拟机 1. 安装 2. 配置 三、安装配置Windows Server 1. 配置 2. 安装 四、虚拟机的环境配置及连接 1. 主机连接虚拟机 2. 虚拟机环境配置及共享 3. 环境配置 一、操作系…...

hugo-stack for github

静态博客框架jekyll、hexo和hugo三者之间的区别与差异 博客生成器? 全名为静态网站生成器&#xff0c; 可在任意拥有主机功能的环境下寄存(托管)可直接配合域名进行全球访问 劣势: 每次更新网页必须重新生成整个网站编译速度&#xff08;单位&#xff1a;秒&#xff09; Jek…...

【uniapp】proxy 代理切换至线上测试地址调试接口

本地测试地址形如&#xff1a;http://192.168.124.x:xxxx 线上测试地址形如&#xff1a;https://xxxx.xxxx.com 使用线上地址之后需要修改配置项 secure 为 true const constant require(./src/utils/constant) module.exports {devServer: {proxy: {/api: {target: constan…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲&#xff0c;何谓六部曲呢&#xff1f; 其实啊&#xff0c;数据分析没那么难&#xff0c;只要掌握了下面这六个步骤&#xff0c;也就是数据分析六部曲&#xff0c;就算你是个啥都不懂的小白&#xff0c;也能慢慢上手做数据分析啦。 第一…...