简要题意

Virtual Judge 传送门 | Codeforces Gym 传送门

给出一个长度为 \(n\) 的序列 \(a\),你需要从中选出一些数,使其两两相加不为质数。输出最大可以选择多少个数。

\(1 \leq n \lt 750,1 \leq a_i \lt 10^7\)

思路

Imakf 学长推荐的题。

首先我们发现,如果对于任意两个数 \(a_i,a_j\),如果 \((a_i+a_j)\in\mathbb{P}\),连边 \((i,j)\)。然后答案就是图的最大独立集。但是一般图最大独立集是 NP-Complete 问题,目前没有多项式时间复杂度解法。

考虑到若 \(a_i,a_j\neq 1\),那么若 \((a_i+a_j)\in\mathbb{P}\),则 \(a_i\bmod 2\neq b_i\bmod 2\)。则若满足上述条件连边,就一定得到的是二分图。

好,然后跑二分图最大匹配,最后将二分图最大匹配转换成二分图最大独立集即可。

等一下,\(a_i=a_j=1\) 的问题我们没有解决,由于如果独立集中有两个及以上 \(1\) 就一定会有质数和出现(\(1+1=2,2\in\mathbb{P}\)),所以我们对值为 \(1\) 的 \(a_i\) 去重即可。

使用匈牙利算法求解二分图最大匹配,时间复杂度均摊 \(O(\max a+n\cdot\frac{n^2}{\log n})\)(这个复杂度是我用素数定理乱算的),理论复杂度上界 \(O(\max a+n^3)\)。可以通过本题。

(思路不难,细节贼多)

代码

#include <bits/stdc++.h>
#define int long long
using namespace std; int pri[20000005];
bool vis[20000005];
int tot; int n,p[800]; struct edge{
int nxt,to;
} g[10000005];
int head[800],ec;
void add(int u,int v){
g[++ec].nxt=head[u];
g[ec].to=v;
head[u]=ec;
} int vist[800],mch[800];
bool hungry(int u,int tag){
if(vist[u]==tag) return false;
vist[u]=tag;
for(int i=head[u];i;i=g[i].nxt){
int v=g[i].to;
if(mch[v]==0||hungry(mch[v],tag)){
mch[v]=u;
return true;
}
}
return false;
} signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n;
vis[1]=1;vis[0]=1;
for(int i=2;i<=(2e7);i++){
if(!vis[i]){
pri[++tot]=i;
}
for(int j=1;j<=tot&&i*pri[j]<=(2e7);j++){
vis[i*pri[j]]=1;
if(!(i%pri[j]))break;
}
}
for(int i=1;i<=n;i++) cin>>p[i];
sort(p+1,p+n+1, greater<int>());
if(p[n]==1){
while(p[n]==1) n--;
n++;
}
for(int i=1;i<=n;i++){
if(!(p[i]&1)) continue;
for(int j=1;j<=n;j++){
if((p[j]&1)) continue;
if(!vis[p[i]+p[j]]) {
add(i,j);
}
}
}
int ret=0;
for(int i=1;i<=n;i++){
if(hungry(i,i)) ret++;
}
cout<<(n-ret);
}

AC Record on Virtual Judge | Codeforces Gym AC 记录 ID:\(188853866\)

最新文章

  1. 生成随机id对比
  2. 【转】单例模式(singletion)
  3. 关于VR边纹理材质的渲染
  4. jQuery基础之(四)jQuery创建DOM元素
  5. Python多进程(1)——subprocess与Popen()
  6. 1989-C. 数字三角形
  7. 关于&quot;干货集中营&quot;的一个开源App
  8. c# winform实现网页上用户自动登陆,模拟网站登录
  9. HTML编辑器UEditor的简单使用
  10. 论MySQL数据库中两种数据引擎的差别
  11. Innobackupex全备恢复(原理、演示)
  12. hadoop2.6环境中部署hive1.2.2的错误
  13. 关于php变量的赋值和引用的区别
  14. centos7.6环境下编译安装tengine-2.2.2的编译安装
  15. 廖雪峰Java8JUnit单元测试-2使用JUnit-1使用Before和After
  16. 跑步“无核心,不PB”
  17. springboot创建错误
  18. POJ-3268.SilverCowParty.(最短路 + 图的转置)
  19. MT【59】一道迭代函数作图
  20. cocos2d-x JS 随机数

热门文章

  1. 小程序 wx.navigateTo和 wx.redirectTo区别
  2. Vue学习之--------Vue生命周期beforeCreate、created、beforeMount、mounted、beforeDestroy 。。。(图解详细过程)(2022/7/17)
  3. 云原生分布式 PostgreSQL+Citus 集群在 Sentry 后端的实践
  4. 如何通过 C#/VB.NET 重命名 Excel 表格并设置选项卡颜色
  5. Django系列---理论一
  6. webpack -- element-ui 的按需引入
  7. echarts标题(title)配置
  8. SpringCloud(七) - 微信支付
  9. mysql是如何实现mvcc的
  10. C语言嵌套for循环实现冒泡排序