我竟然半个小时切了一道JSOI2016,,,,不敢相信。

首先可以发现,如果N个数中1出现的次数<=1的话,我们按不能在一个集合连无向边的话,连出的一定是一个二分图。

接下来我来证明一下:

因为1出现的次数<=1,所以如果两个数的和是质数的话,首先得满足他们的和是奇数,所以这两个数肯定得是一奇一偶,也就是连出的图中的边的两个端点的奇偶性肯定是不同的,这就证明了这是一个二分图。

然后我们还可以发现,如果1的个数>1的话,我们只留下一个1,答案是不变的,因为1的选择只能是{0,1},多了没用。

于是我们就可以开心的建一个二分图然后跑一个最大独立就行了2333

#include<bits/stdc++.h>
#define ll long long
#define pb push_back
const int maxn=3010;
using namespace std;
int zs[100005],num=0;
bool v[200005];
int n,a[maxn],S,T,t=-1;
vector<int> g[maxn];
struct lines{
int to,flow,cap;
}l[maxn*maxn];
int d[maxn],cur[maxn];
bool vis[maxn]; inline void add(int from,int to,int cap){
l[++t]=(lines){to,0,cap},g[from].pb(t);
l[++t]=(lines){from,0,0},g[to].pb(t);
} inline bool BFS(){
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(S),d[S]=0,vis[S]=1; int x; lines e;
while(!q.empty()){
x=q.front(),q.pop();
for(int i=g[x].size()-1;i>=0;i--){
e=l[g[x][i]];
if(e.flow<e.cap&&!vis[e.to]){
vis[e.to]=1,d[e.to]=d[x]+1;
q.push(e.to);
}
}
} return vis[T];
} int dfs(int x,int A){
if(x==T||!A) return A;
int flow=0,f,sz=g[x].size();
for(int &i=cur[x];i<sz;i++){
lines &e=l[g[x][i]];
if(d[e.to]==d[x]+1&&(f=dfs(e.to,min(e.cap-e.flow,A)))){
A-=f,e.flow+=f;
flow+=f,l[g[x][i]^1].flow-=f;
if(!A) break;
}
}
return flow;
} inline int max_flow(){
int an=0;
while(BFS()){
memset(cur,0,sizeof(cur));
an+=dfs(S,1<<30);
}
return an;
} inline void init(){
for(int i=2;i<=200000;i++){
if(!(v[i])) zs[++num]=i;
for(int j=1,u;j<=num&&(u=zs[j]*i)<=200000;j++){
v[u]=1;
if(!(i%zs[j])) break;
}
}
} inline void solve(){
for(int i=1;i<=n;i++)
if(a[i]&1) add(S,i,1);
else add(i,T,1);
for(int i=1;i<=n;i++) if(a[i]&1)
for(int j=1;j<=n;j++) if(!(a[j]&1)&&!v[a[i]+a[j]]) add(i,j,1);
printf("%d\n",n-max_flow());
} int main(){
init();
scanf("%d",&n),S=0,T=n+1;
for(int i=1;i<=n;i++){
scanf("%d",a+i);
if(a[i]==1){
if(v[1]) i--,n--;
else v[1]=1;
}
} solve(); return 0;
}

[JSOI2016]反质数序列的更多相关文章

  1. [BZOJ4857][JSOI2016]反质数序列[最大点独立集]

    题意 在长度为 \(n\) 的序列 \(a\) 中选择尽量长的子序列,使得选出子序列中任意两个数的和不为质数. \(n\leq3000\ ,a_i\leq10^5\). 分析 直接按照奇偶性建立二分图 ...

  2. [BZOJ 4857][Jsoi2016]反质数序列

    传送门 $ \color{green} {solution : } $ 因为 $ 1 $ 的个数我们最多只能选一个,所以剩下的数如果组成素数那么只有一奇一偶,显然是个二分图模型 #include &l ...

  3. 【LOJ】#2081. 「JSOI2016」反质数序列

    题解 我居然都没反应过来二分图内选集合两两不能有边是最大独立集了 我退役吧 显然连边只能在奇数和偶数之间,然后二分图求最大独立集是节点数-最大匹配数 啊当然还有对于1的话只能留一个1 代码 #incl ...

  4. BZOJ 4857 反质数序列

    题面 奇数+奇数一定不是质数(1+1除外),偶数+偶数一定不是质数,质数只可能出现在偶数+奇数中 把所有的点排成两列,权值为奇数的点在左边,权值为偶数的在右边 如果左边的点x+右边的点y是质数,我们就 ...

  5. CNUOJ 0486 800401反质数

    难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 将正整数 x 的约数个数表示为 g(x).例如,g(1)=1,g(4)=3, g ...

  6. 反质数问题,求不大于n的最大反质数

    反质数:设f(n)表示n个约数的个数,如果对于任意x有0<x<n, f(x) < f(n),那么n就是一个反质数 我们都知道对于任意一个数n,都可以用质数乘积的形式表示出来:x = ...

  7. 反质数(Antiprimes)

    转载http://www.cnblogs.com/tiankonguse/archive/2012/07/29/2613877.html 问题描述: 对于任何正整数x,起约数的个数记做g(x).例如g ...

  8. COJN 0486 800401反质数 呵呵呵呵呵

    800401反质数 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 将正整数 x 的约数个数表示为 g(x).例如,g(1)=1 ...

  9. HYSBZ 1053 反质数

    input n 1<=n<=2000000000 output 不大于n的最大反质数 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g( ...

随机推荐

  1. 当数据量很少的时候,tableview会显示多余的cell--iOS开发系列---项目中成长的知识二

    当数据量很少的时候,tableview会显示很多的cell,而且是空白的,这样很不美观 所以使用下面的方法可以去掉多余的底部的cell 原理是:设置footerView为frame 是 CGRectZ ...

  2. EAGLView介绍

    http://book.51cto.com/art/201108/285446.htm

  3. minGw64编译Qt时遇到too many sections问题

    minGw64编译Qt时遇到too many sections问题: 修改\Src\qtbase\mkspecs\win32-g++\qmake.conf中 QMAKE_CFLAGS         ...

  4. hihoCode-1043-完全背包

    我们定义:best(i,x)代表i件以前的物品已经决定好选择多少件,并且在剩余奖券x的情况下的最优解. 我们可以考虑最后一步,是否再次选择i物品,在不超过持有奖券总额的情况下.上面的第二个式子的k是大 ...

  5. docker:安装mysql多个

    文章来源:https://www.cnblogs.com/hello-tl/p/9238298.html 1.首先安装docker 参照一下网址安装docker docker:安装 https://w ...

  6. python安装numpy模块

    1.打开网址https://pypi.python.org/pypi/numpy,找到安装的python版本对应的numpy版本. 我的python版本是 下载的对应numpy版本是 2.将numpy ...

  7. Errors occurred during the build. Errors running builder 'JavaScript Validator'

    选择一个项目--右键Properties--Builders--取消第2个"JavaScript Validator"的勾就OK了.

  8. Java-对复合类型数据进行排序

    Array.sort(arr)可以进行简单的排序,如果需要复杂的排序可以实现Comparable package com.tj; import java.util.Arrays; public cla ...

  9. 读CSS DIV网页样式与布局心得体会

    一.首先根据网页设计图拆分网页的整体结构 二.在html页面用DIV划分出结构块 三.再根据设计图在各个大<DIV>块中加入对应的小<DIV>块或者段落<P>,表单 ...

  10. [android开发篇]自定义权限

    有时候,我们可能遇到如下需求场景:当用户在一个应用程序中进行某项操作时,会启动另外一个应用程序,最常见的时直接打开了另外一个应用程序,并进入其中某个Activity(如:有的应用中有推荐应用列表,当用 ...