2023NOIP A层联测17-黑暗料理

2023-10-24 16:36
文章标签 17 黑暗 联测 2023noip 料理

本文主要是介绍2023NOIP A层联测17-黑暗料理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简要题意:在 n n n 个数中选尽可能多的数,使得任意两个数之和不是质数。

n ≤ 750 , a i ≤ 1 0 9 n\le750,a_i\le10^9 n750,ai109


两个数之和为质数,说明两个数一奇一偶,或者都是 1 1 1

把重复的 1 1 1 删去,因为后面不会同时选多个 1 1 1

建立二分图,奇数放在左边,偶数放在右边,若两个数之和为质数,就连一条边。这里用 miller rabin \text{miller rabin} miller rabin 判断。

我们的目标是删去尽可能少的点及其相邻的边,使所有边都被删去。这不就是二分图最小点覆盖问题吗?

而最小点覆盖等于最大匹配。所以只要对这个图求一次最大匹配即可。

于是就解决了。时间复杂度 O ( n 2 log ⁡ 2 n ) O(n^2\log^2n) O(n2log2n)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=1e9,NN=751,MM=280876;
int n,m,a[NN],cx[NN],cy[NN],vis[NN];
int head[NN],nxt[MM<<1],to[MM<<1],cnt=1;
bool cmp(int a,int b)
{int x=a&1,y=b&1;if(x!=y) return x<y;return a>b;
}
void add(int u,int v)
{to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;
}
bool dfs(int u)
{for(int i=head[u];i;i=nxt[i]){if(!vis[to[i]]){vis[to[i]]=1;if(!cy[to[i]]||dfs(cy[to[i]])){cx[u]=to[i];cy[to[i]]=u;return 1;}}}return 0;
}
int match(int n)
{int ans=0;memset(cx,0,sizeof(cx));memset(cy,0,sizeof(cy));for(int i=1;i<=n;i++){memset(vis,0,sizeof(vis));if(!cx[i]) ans+=dfs(i);}return ans;
}
ll ksm(ll a,ll b,ll mod)
{ll ans=1;while(b){if(b&1) ans=ans*a%mod;b>>=1;a=a*a%mod;}return ans;
}
int test[]={2,7,61};
bool check(ll a,ll x)
{ll czn=x-1;if(ksm(a,czn,x)!=1) return 0;do{ll xx=ksm(a,czn/2,x);if(xx!=1&&xx!=x-1) return 0;czn>>=1;}while(czn%2==0&&ksm(a,czn,x)==1);return 1;
}
bool miller_rabbin(ll x)
{if(x==1) return 0;if(x==2||x==7||x==61) return 1;for(int i=0;i<3;i++){if(!check(test[i],x))return 0;}return 1;
}
int main()
{freopen("cooking.in","r",stdin);freopen("cooking.out","w",stdout);int t;cin>>t;while(t--){cnt=0;memset(head,0,sizeof(head));memset(nxt,0,sizeof(nxt));scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);sort(a+1,a+1+n,cmp);int l=1;while(a[l]%2==0) l++;while(a[n-1]==1) n--;for(int i=1;i<l;i++){for(int j=l;j<=n;j++){if(miller_rabbin(a[i]+a[j])){add(i,j),add(j,i);}}}cout<<n-match(l-1)<<endl;}
}

这篇关于2023NOIP A层联测17-黑暗料理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/276448

相关文章

17 通过ref代替DOM用来获取元素和组件的引用

重点 ref :官网给出的解释是: ref: 用于注册对元素或子组件的引用。引用将在父组件的$refs 对象下注册。如果在普通DOM元素上使用,则引用将是该元素;如果在子组件上使用,则引用将是组件实例: <!-- vm.$refs.p will be the DOM node --><p ref="p">hello</p><!-- vm.$refs.child will be the c

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

《黑暗之魂2:原罪学者》是什么类型的游戏 《黑暗之魂》可以在苹果Mac电脑上玩吗?

在宏大的世界观游戏中,《黑暗之魂2:原罪学者》脱颖而出,以其探索性和挑战性征服了全球玩家的心灵。下面我们来看看《黑暗之魂2:原罪学者》是什么类型的游戏,《黑暗之魂2:原罪学者》可以在苹果电脑玩吗的相关内容。 一、《黑暗之魂2:原罪学者》是什么类型的游戏 《黑暗之魂2:原罪学者》作为《黑暗之魂2》的增强版和重制版,是一款FromSoftware制作、BANDAI NAMCO和FromSoft

【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)「首先来看看目前已有的资料,还会不断更新哦~一次购买,后续不会再被收费哦,保证是全网最全资源,随着后续内容更新,价格会上涨,越早购买,价格越低,让大家再也不需要到处买断片资料啦~💰💸👋」�

算法练习题17——leetcode54螺旋矩阵

题目描述 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。  代码 import java.util.*;class Solution {public List<Integer> spiralOrder(int[][] matrix) {// 用于存储螺旋顺序遍历的结果List<Integer> result = new ArrayList

标准库标头 <filesystem> (C++17)学习

此头文件是文件系统支持库的一部分。本篇介绍filesystem命名空间的一些函数。 函数 在命名空间 std::filesystem 定义 absolute (C++17) 组成一个绝对路径 (函数) canonicalweakly_canonical (C++17) 组成一个规范路径 (函数) relativeproximate (C++17) 组成一个相对路径 (函数) copy (C

C++基础:折叠表达式(C++17)

C++基础:折叠表达式(C++17) 简介语法展开 示例 简介 C++17 引入了一种新的语法特性,叫做折叠表达式,它允许编译器在模板参数包展开时进行元编程操作。折叠表达式的引入极大地简化了元编程代码,使其变得更为直观和简介。 语法 折叠表达式,简单来说,就是以二元运算符对形参包进行折叠,总共有以下四种类型: 一元右折叠一元左折叠二元右折叠二元左折叠 其对应的语法如下:

javaweb-day01-2(00:17:48 XML 的作用 和 语法)

XML: 描述 可扩展标记语言,w3c  2000年发布的 XML 1.0 版本规范。 用来描述数据之间的关系。 经常用作 软件  的配置文件,描述 模块与模块 之间的关系。 还用作    软件启动  的配置文件,描述 启动模块之间的 依赖 关系。 语法 一个XML文件分为如下几部分内容: 文档声明元素属性注释CDATA区、转义字符处

PostgreSQL 17即将发布,新功能Top 3

按照计划,PostgreSQL 17 即将在 2024 年 9 月 26 日发布,目前已经发布了第一个 RC 版本,新版本的功能增强可以参考 Release Notes。 本文给大家分享其中 3 个重大的新增功能。 MERGE 语句增强 MERGE 语句是 PostgreSQL 15 增加的一个新功能,它可以在单个语句中实现 INSERT、UPDATE 以及 DELETE 操作,非常适合数据

关于LLC知识17

1、如何判断一个元器件是不是源? 对于Lr,Lm,Cr这三个元器件,在工作过程中,能量是不断变化的,如果某个元器件的能量增大,说明它在充电,不是源,如果某个元器件的能量是在慢慢减小,说明是在放电就是一个源。 对于一个理想变压器来说,到副边始终是传输能量,能量是透传的,所以不存在充电和放电的问题。 2、判断透传电流正负的方法 Lm压差为上正下负时候,副边D1导通,副边从同名端出,原边也从