http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1552

把那n个数写两次,分成相同的两堆,判断相加是质数的,连一条边,然后找最大匹配,ans = 最大匹配 / 2

做的时候一直超时,原来是Miller_Rabin的quick_pow那里需要quick_mul配合,不然溢出。

#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <cmath>
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <time.h>
#define clr(u,v); memset(u,v,sizeof(u));
using namespace std;
typedef long long LL;
const int maxn = + ;
const int check_time = ;
bool e[maxn][maxn]; LL quick_mul(LL a, LL b, LL MOD) {
//求解 a*b%MOD的算法 // 原理:2*19 = 2*(1+2+16)
LL base = a % MOD;
b %= MOD; // a*b%MOD 等价于 (a%MOD * b%MOD) % MOD;
LL ans = ; //记住是0 因为中间过程是加
while (b) {
if (b & ) {
ans = (ans + base); //直接取模慢很多
if (ans >= MOD) ans -= MOD;
}
base = (base << ); //notice
if (base >= MOD) base -= MOD;
b >>= ;
}
return ans;
}
LL quick_pow(LL a, LL b, LL MOD) { //求解 a^b%MOD的值
LL base = a % MOD;
LL ans = ; //相乘,所以这里是1
while (b) {
if (b & ) {
ans = quick_mul(ans, base, MOD); //如果这里是很大的数据,就要用quick_mul
}
base = quick_mul(base, base, MOD); //notice。注意这里,每次的base是自己base倍
b >>= ;
}
return ans;
}
bool check(LL a, LL n, LL x, LL t) { //以a为基。n-1写成了 2^t * k,判断n是否为合数
LL ret = quick_pow (a, x, n); //先算 a^k%n 后来一直平方.平方t次
LL last = ret; //last就是a^k次方这个值,看成整体。符合X^2这个公式
for (int i = ; i <= t; ++i) {
ret = quick_mul(ret, ret, n); //平方他,last就是一个大X,ret是X^2
if (ret == && last != && last != n - ) return true; //合数
last = ret;
}
if (ret != ) return true; //费马小定理,如果a^(n-1)%n != 1就绝逼不是素数
return false;
}
bool Miller_Rabin(LL n) { //判断n是否质数
if (n < ) return false;
if (n == ) return true;
if (n % == ) return false; //偶数不是质数
LL k = n - ;
LL t = ; //把n-1拆成 2^t * k 这种形式,那么从k开始验证,a^k,不断平方即可
while ( (k & ) == ) { //如果x还是偶数的话,就是还有2的因子
k >>= ;
t++;
}
for (int i = ; i <= check_time; i++) {
LL a = rand() % (n - ) + ; //最大去到n-1,[1,n-1]
if (check (a, n, k, t)) //n-1写成了 2^t * k.米勒测试
return false; //合数
}
return true; //质数
} LL arr[maxn];
int n;
int match[maxn];
bool vis[maxn];
int dfs(int u) {
for (int i = ; i <= n; ++i) {
if (!vis[i] && e[u][i]) {
vis[i] = true;
if (match[i] == || dfs(match[i])) {
match[i] = u;
return ;
}
}
}
return ;
}
int hungary() {
memset(match, , sizeof match);
int ans = ;
for (int i = ; i <= n; ++i) {
memset(vis, false, sizeof vis);
if (dfs(i)) ans++;
}
return ans / ;
}
void work() {
memset(e, false, sizeof e);
// memset(match, 0, sizeof match);
for (int i = ; i <= n; ++i) {
scanf("%lld", &arr[i]);
}
for (int i = ; i <= n; ++i) {
for (int j = i + ; j <= n; ++j) {
if (Miller_Rabin(arr[i] + arr[j])) {
e[i][j] = true;
e[j][i] = true;
}
}
}
// for (int i = 1; i <= n; ++i) {
// for (int j = 1; j <= n; ++j) {
// cout << e[i][j] << " ";
// }
// cout << endl;
// }
printf("%d\n", hungary());
} int main() {
#ifdef local
freopen("case.in", "r", stdin);
// freopen("out.out", "w", stdout);
#endif
srand(time(NULL));
// cout << Miller_Rabin(1) << endl;
while (scanf("%d", &n) != EOF) work();
return ;
}

csu 1552: Friends 二分图 + Miller_Rabin的更多相关文章

  1. csu 1552(米勒拉宾素数测试+二分图匹配)

    1552: Friends Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 723  Solved: 198[Submit][Status][Web Bo ...

  2. CSU 1552 Friends(二分图 + 米勒测试)

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1552 Description On an alien planet, every e ...

  3. CSU 1552: Friends 图论匹配+超级大素数判定

    1552: Friends Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 163  Solved: 34[Submit][Status][Web Boa ...

  4. HDU2389(KB10-F 二分图最大匹配Hopcroft_Karp)

    Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Java/Ot ...

  5. BZOJ.4514.[SDOI2016]数字配对(费用流SPFA 二分图)

    BZOJ 洛谷 \(Solution\) 很显然的建二分图后跑最大费用流,但有个问题是一个数是只能用一次的,这样二分图两部分都有这个数. 那么就用两倍的.如果\(i\)可以向\(j'\)连边,\(j\ ...

  6. CSU 1508:地图的四着色(DFS+剪枝)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1508 题意:地图中四联通的块是一个国家,A和B每个人可以涂两种颜色,且B不能涂超过5次,相邻的国家 ...

  7. C - NP-Hard Problem(二分图判定-染色法)

    C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:262144 ...

  8. POJ 2125 Destroying the Graph 二分图最小点权覆盖

    Destroying The Graph Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8198   Accepted: 2 ...

  9. bzoj4025 二分图

    支持加边和删边的二分图判定,分治并查集水之(表示我的LCT还很不熟--仅仅停留在极其简单的模板水平). 由于是带权并查集,并且不能路径压缩,所以对权值(到父亲距离的奇偶性)的维护要注意一下. 有一个小 ...

随机推荐

  1. python 实用pickle序列化

    存储数据结构到一个文件中称为序列化.相json这样的格式需要定制的序列化数据的转换器.python提供了pickle模块以特殊的二进制格式保存和恢复数据对象. 还记得json解析datetime对象时 ...

  2. Sublime Text 相关教程(转)

    曾经有人说过,世界上有两种编辑器,好用和不好用的:而在好用的编辑器中,又分两种,免费的和死贵死贵的.譬如说VIM 和 TextMate,就是免费和死贵的典型.很不幸,今天的主角 Sublime Tex ...

  3. 最新版ADT(Build: v22.6.2)总是引用appcompat_v7的问题

    昨天在ADT Manager里更新了一些组件,结果ADT不支持.索性直接下载了最新的ADT.但是发现无论创建什么类型的应用(无论支持的最低API是多少,或者是不是用模板),都会在创建应用的同时创建一个 ...

  4. POJ3728 THE MERCHANT LCA RMQ DP

    题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. ...

  5. visualstudio2017 +EF+Mysql生成实体数据模型闪退

    VisualStudio2017+EF+MySql正常运转,费了不少劲,踏过不少坑 1.安装 Connector/NET 8.0.13 地址:https://dev.mysql.com/downloa ...

  6. Eclipse中建立自己的类库,给不同的工程使用

    win7 进入服务 开始 运行 services.msc 在多个工程当中,可能使用到相同的jar包,这时,如果我们建立一个自己的类库,该类库中存放着所有工程均需要的jar包,就可以免去重复导入的麻烦. ...

  7. Eclipse如何查看接口实现类快捷键

    1.找到要打开的接口类 2.双击接口名选中 3.按Ctrl+T打开接口实现类 以List接口为例,如下所示

  8. CCF 201509-1 数列分段 (水题)

    问题描述 给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段? 输入格式 输入的第一行包含一个整数n,表示数列中整数的个数. 第二行包含n个整数a1, a2, …, an,表示 ...

  9. 洛谷 - P1829 - Crash的数字表格 - 莫比乌斯反演

    求: \(S(n,m)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}lcm(i,j)\) 显然: \(S(n,m)=\sum\limits_{i=1}^{n}\ ...

  10. unity关于StartCoroutine的简单线程使用

    StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程. 在C#中直接有Thread这个线程,但是在unity中有些元素是不能操作的.这个时候可以使用协程来完成. 使 ...