二次联通门 : LibreOJ #526. 「LibreOJ β Round #4」子集

/*
LibreOJ #526. 「LibreOJ β Round #4」子集 考虑一下,若两个数奇偶性相同
若同为奇数, 那加1后就是偶数, gcd的乘积就一定不是1
偶数相同 那么我们把原数中的偶数分为一个集合,奇数分为一个集合
把互相之间不符合要求的连边 那么问题就转化为了二分图求最大独立集
*/
#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring> const int BUF = ;
char Buf[BUF], *buf = Buf;
#define INF 1e9
inline void read (long long &now)
{
for (now = ; !isdigit (*buf); ++ buf);
for (; isdigit (*buf); now = now * + *buf - '', ++ buf);
} #define Max 600
struct E { E *n, *r; int v, f; };
E *list[Max], poor[Max * ], *Ta = poor;
int S, T; class Flow_Type
{
private : int d[Max]; bool Bfs (int S, int T)
{
memset (d, -, sizeof d); d[S] = ;
std :: queue <int> Queue; int now; E *e;
for (Queue.push (S); !Queue.empty (); Queue.pop ())
{
now = Queue.front ();
for (e = list[now]; e; e = e->n)
if (d[e->v] == - && e->f)
{
d[e->v] = d[now] + ;
if (e->v == T) return true;
Queue.push (e->v);
}
}
return d[T] != -;
} int Flowing (int now, int F)
{
if (now == T || !F) return F;
int res = , pos; E *e;
for (e = list[now]; e; e = e->n)
{
if (d[e->v] != d[now] + || !e->f) continue;
pos = Flowing (e->v, e->f < F ? e->f : F);
if (pos)
{
F -= pos, res += pos, e->f -= pos, e->r->f += pos;
if (!F) return res;
}
}
if (res != F) d[now] = -;
return res;
} public : inline void In (int u, int v)
{
++ Ta, Ta->v = v, Ta->n = list[u], list[u] = Ta, Ta->f = ;
++ Ta, Ta->v = u, Ta->n = list[v], list[v] = Ta, Ta->f = ;
list[u]->r = list[v], list[v]->r = list[u];
} int Dinic (int S, int T)
{
int Answer = ;
for (; Bfs (S, T); Answer += Flowing (S, INF));
return Answer;
}
}; Flow_Type F;
long long key[Max];
long long Gcd (long long a, long long b) { return !b ? a : Gcd (b, a % b); }
int Main ()
{
fread (buf, , BUF, stdin);
long long N; read (N); S = N + , T = N + ;
register int i, j;
for (i = ; i <= N; ++ i)
{
read (key[i]);
if (key[i] & ) F.In (i, T);
else F.In (S, i);
}
for (i = ; i <= N; ++ i)
{
if ((key[i] & ) == )
for (j = ; j <= N; ++ j)
if (key[j] & )
if (Gcd (key[i], key[j]) == && Gcd (key[i] + , key[j] + ) == )
F.In (i, j);
} printf ("%d", N - F.Dinic (S, T)); return ;
} int ZlycerQan = Main ();
int main (int argc, char *argv[]) {;}

最新文章

  1. WPF 自定义BarChartControl(可左右滑动的柱状图)
  2. OAF_文件系列8_实现OAF处理Excel的JXL包详解
  3. TortoiseSVN安装使用(转)
  4. 现在不能使用foxmail同步qq记事本功能,可能是对字数的大小有限制
  5. Tomcat无法启动:org.apache.catalina.LifecycleException: Failed to start component 问题解决
  6. 跨域请求之JSONP 三
  7. 非常有用的Java程序片段
  8. UESTC_Frozen Rose-Heads CDOJ 791
  9. 如何在高并发的分布式系统中产生UUID
  10. 入侵检测工具之RKHunter &amp; AIDE
  11. K8S API 调用
  12. dict字典的一些优势和劣势
  13. MySQL各版本解释和下载
  14. Python学习笔记-输入与输出
  15. 物联网架构成长之路(3)-EMQ消息服务器了解
  16. POJ 2575
  17. C语言扫盲篇
  18. [py]str list切片-去除字符串首尾空格-递归思想
  19. 状态机中的RAM注意的问题--减少扇出的办法
  20. .split(&quot;\n&quot;) 和 .strip(&quot;我是诗人的感叹&quot;)

热门文章

  1. JAVA的枚举基本操作,对原码反码补码的理解及为运算的深入理解,浮点数计算的误差分析
  2. 在 centos 上安装 virutalbox
  3. Java对list进行分页,subList()方法实现分页
  4. 【洛谷 P5341】 [TJOI2019]甲苯先生和大中锋的字符串(后缀自动机)
  5. 【转载】 C#中通过Where方法查找出所有符合条件的元素集合
  6. FreeRTOS优先级翻转
  7. I、Mac 下的Vue
  8. 1、uiautomator2常用语法
  9. MySQL之Prepared Statements
  10. kubernetes 基本概念和资源对象汇总