[ABC263G] Erasing Prime Pairs
Problem Statement
There are integers with $N$ different values written on a blackboard. The $i$-th value is $A_i$ and is written $B_i$ times.
You may repeat the following operation as many times as possible:
- Choose two integers $x$ and $y$ written on the blackboard such that $x+y$ is prime. Erase these two integers.
Find the maximum number of times the operation can be performed.
Constraints
- $1 \leq N \leq 100$
- $1 \leq A_i \leq 10^7$
- $1 \leq B_i \leq 10^9$
- All $A_i$ are distinct.
- All values in input are integers.
Input
Input is given from Standard Input in the following format:
$N$
$A_1$ $B_1$
$A_2$ $B_2$
$\vdots$
$A_N$ $B_N$
Output
Print the answer.
Sample Input 1
3
3 3
2 4
6 2
Sample Output 1
3
We have $2 + 3 = 5$, and $5$ is prime, so you can choose $2$ and $3$ to erase them, but nothing else. Since there are four $2$s and three $3$s, you can do the operation three times.
Sample Input 2
1
1 4
Sample Output 2
2
We have $1 + 1 = 2$, and $2$ is prime, so you can choose $1$ and $1$ to erase them. Since there are four $1$s, you can do the operation twice.
既然要判断质数,一个肯定要做的操作就是把 \(2\times10^7\) 之内的质数筛出来。不妨把和为质数的两个点连条边。边相连的两个点的点权可以同时减去一个数,要保证点权为正数,问最多操作次数。
手动模拟一下,有网络流的感觉。于是考虑最大流解决。把第 \(i\) 种数拆成两个点,第一个点编号为 \(i\),第二个点编号为 \(n+i\)。对于第 \(i\) 个数,从源点 \(s\) 连一条流量为 \(b_i\) 的边,从 \(i+n\) 连一条流量为 \(b_i\) 的边至汇点 \(t\)。如果 \(a_i+a_j\) 为质数,从 \(i\) 连一条流量为 \(+\infty\) 的边至 \(j+n\)。然后跑一次最大流,得出答案后除以 \(2\) 就是答案。
为什么要除以 \(2\)?由于我们计算最大流时,\(a_i+a_j\) 若为质数,那么 \(i\) 到 \(j+n\) 的边中算了一次,\(j+n\) 至 \(i\) 的边中算了一次。所以算了两次。
但是我们没考虑 \(1+1=2\)?其实计算最大流时已经计算。须要两个 \(1\) 才能有一次删除机会,而我们最后也除以了 \(2\)。所以不需要特殊判断。
#include<bits/stdc++.h>
using namespace std;
const int N=205,M=40005,P=2e7+5;
int n,m,s,t,k,g,hd[N],l,r,v[N],q[N],vhd[N],uu,vv,ww,e_num=1,p[P],p_num,pri[P],a[N],b[N],ee;
struct edge{
int v,nxt,w;
}e[M<<1];
void add_edge(int u,int v,int w)
{
e[++e_num]=(edge){v,hd[u],w};
hd[u]=e_num;
}
long long ans;
int bfs()
{
memset(v,0,sizeof(v));
memcpy(hd,vhd,sizeof(hd));
q[l=r=1]=s,v[s]=1;
while(l<=r)
{
if(q[l]==t)
break;
for(int i=hd[q[l]];i;i=e[i].nxt)
if(e[i].w>0&&!v[e[i].v])
q[++r]=e[i].v,v[e[i].v]=v[q[l]]+1;
++l;
}
return v[t];
}
int dfs(int x,int s)
{
// printf("%d %d\n",x,s);
if(x==t)
return s;
int b,c;
for(int&i=hd[x];i;i=e[i].nxt)
{
b=e[i].v,c=min(s,e[i].w);
if(v[b]==v[x]+1&&c>0)
{
g=dfs(b,c);
if(g)
{
e[i].w-=g;
e[i^1].w+=g;
return g;
}
else
v[b]=0;
}
}
return 0;
}
signed main()
{
scanf("%d",&n);
s=0,t=2*n+1;
for(int i=2;i<P;i++)
{
if(!pri[i])
p[++p_num]=i;
for(int j=1;j<=p_num&&1LL*p[j]*i<P;j++)
{
pri[p[j]*i]=1;
if(i%p[j]==0)
break;
}
}
for(int i=1;i<=n;i++)
scanf("%lld%lld",a+i,b+i);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(!pri[a[i]+a[j]])
{
add_edge(i,n+j,2e9);
add_edge(j+n,i,0);
}
}
}
for(int i=1;i<=n;i++)
{
add_edge(s,i,b[i]);
add_edge(i,s,0);
}
for(int i=1;i<=n;i++)
{
add_edge(i+n,t,b[i]);
add_edge(t,i+n,0);
}
memcpy(vhd,hd,sizeof(hd));
while(bfs())
{
while(k=dfs(s,2e9))
ans+=k;
}
printf("%lld",ans/2);
return 0;
}
[ABC263G] Erasing Prime Pairs的更多相关文章
- F. Count Prime Pairs
单点时限: 2.0 sec 内存限制: 512 MB 对于数组a,如果i≠j并且ai+aj是一个质数,那么我们就称(i,j)为质数对,计算数组中质数对的个数. 输入格式 第一行输入一个n,表示数组的长 ...
- 2018.9.20 Educational Codeforces Round 51
蒟蒻就切了四道水题,然后EF看着可写然而并不会,中间还WA了一次,我太菜了.jpg =.= A.Vasya And Password 一开始看着有点虚没敢立刻写,后来写完第二题发现可以暴力讨论,因为保 ...
- Educational Codeforces Round 51 (Rated for Div. 2)
做了四个题.. A. Vasya And Password 直接特判即可,,为啥泥萌都说难写,,,, 这个子串实际上是忽悠人的,因为每次改一个字符就可以 我靠我居然被hack了???? %……& ...
- HPU暑期集训积分赛1
A. Nth power of n 单点时限: 1.0 sec 内存限制: 512 MB 求 nn 的个位数. 输入格式 多组输入,处理到文件结束.每组数据输入一个 n.(1≤n≤109) 输出格式 ...
- CodeForces Educational Codeforces Round 51 (Rated for Div. 2)
A:Vasya And Password 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen(&q ...
- Codeforces Edu Round 51 A-D
A. Vasya And Password 模拟题,将所缺的种类依次填入"出现次数$ >1 $"的位置,替换掉Ta即可. #include <iostream> ...
- Pairs Forming LCM(素因子分解)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=109329#problem/B 全题在文末. 题意:在a,b中(a,b<=n) ...
- LightOJ 1236 - Pairs Forming LCM(素因子分解)
B - Pairs Forming LCM Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu ...
- 数论 - 素数的运用 --- poj 2689 : Prime Distance
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12512 Accepted: 3340 D ...
- LightOJ 1236 Pairs Forming LCM (LCM 唯一分解定理 + 素数筛选)
http://lightoj.com/volume_showproblem.php?problem=1236 Pairs Forming LCM Time Limit:2000MS Memor ...
随机推荐
- 知识图谱(Knowledge Graph)- Neo4j 5.10.0 使用 - Java SpringBoot 操作 Neo4j
上一篇使用了 CQL 实现了太极拳传承谱,这次使用JAVA SpringBoot 实现,只演示获取信息,源码连接在文章最后 三要素 在知识图谱中,通过三元组 <实体 × 关系 × 属性> ...
- Pytest+Jenkins 学习笔记
Pytest+Jenkins 学习笔记 在软件测试工作中,单元测试通常是由开发人员执行的.针对最小单元粒度的组件测试,在完成了单元粒度的测试任务之后,通常就需要交由专职的测试人员将这些单元级的组件放到 ...
- 使用API接口获取淘宝商品数据的详细指南
在电商行业中,淘宝作为中国最大的在线购物平台,每天有数以百万计的商品被发布和交易.作为程序员,如果需要获取淘宝商品的详细数据,可以通过调用API接口来实现.本文将详细介绍如何使用淘宝API接口获取 ...
- 《Python魔法大冒险》009 魔法之语:字符串的奥秘
随着小鱼和魔法师的深入,他们来到了一个被薄雾笼罩的湖泊.湖中央有一个小岛,岛上有一棵巨大的古树,树上挂满了闪闪发光的果实,每一个果实上都刻着一个字母或符号. 小鱼好奇地问:"这些是什么果实? ...
- HTML一键打包APK工具最新版1.9.1更新(附下载地址)
HMTL网址打包APK,可以把本地HTML项目, Egret游戏,网页游戏,或者网站打包为一个安卓应用APK文件,无需编写任何代码,也无需配置安卓开发环境,支持在最新的安卓设备上安装运行. HTML一 ...
- 教你2种方法,将iOS设备通过MQTT协议连接到华为云物联网平台
本文分享自华为云社区<如何将iOS设备通过MQTT协议连接到华为云物联网平台: Flutter和Swift两种方法>,作者: 张俭 . 前言 当今时代,物联网技术正逐步改变我们的生活和工作 ...
- Solution -「洛谷 P7395」「CoE-I 2021C」弹珠游戏
Description Link. 游戏在 \(4\times4\) 的菱形棋盘上进行: 两名玩家轮流放置弹珠,可以在横向.纵向.\(45\) 度斜线.\(135\) 度斜线方向未放置弹珠的位置连续放 ...
- netstat命令输出详解
netstat命令输出详解 1. 列出所有的TCP和UDP端口 2. 命令输出详解 Proto:协议名(tcp协议还是udp协议) recv-Q:网络接收队列,send-Q:网路发送队列 a. rec ...
- MySQL实战实战系列 06 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
今天我要跟你聊聊 MySQL 的锁.数据库锁设计的初衷是处理并发问题.作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则.而锁就是用来实现这些访问规则的重要数据结构. 根据 ...
- QQ机器人整理合集
QQ机器人有什么用呢? QQ机器人可以实现包括自动回复.定时推送.发送图片QQ机器人,营销圈用的比较多,可以开发各种自动功能等等.用其制作的QQ机器人程序 机器人框架+插件 小栗子机器人 官网:htt ...