「国庆训练」Kingdom of Obsession(HDU-5943)
题意
给定\(s,n\),把\(s+1,s+2,...,s+n\)这\(n\)个数填到\(1,2,...,n\)里,要求\(x\)只能填到\(x\)的因子的位置(即题目中\(x\%y=0\)那么x才能放在y位置的要求),问是否能够把所有数都填上去。
分析
建模之后就是条二分图的板子题。
注意到一个有趣的事实:如果\([s+1,s+n]\)中有两个质数,那他们肯定完蛋。因为它们一定都会和1连边然后翻车。
这意味着什么呢?在\(10^9\)的范围里面,质数最大的间隔是282(我抄网上的结论的,正确不保证,反正不多),那么我们就可以认定如果n比这个数更大一定是No。
然后就可以快乐建图了,把取模为0的建一条有向边,看看最后能否找到完美匹配即可。
实现上,s应当比n大。为什么?如果\(s<n\),那么\([s+1,n]\)直接放在自己的位置上即可,因为不可能放在比他们更大的地方了(集合的交):那爽死了,我们只需要考虑\([1,s]\)与剩下\([n+1,s+n]\)的匹配即可,这个东西的实质就是n、s交换。有没有其他数\(k\)放在这些位置上面(如一个数\(x\))然后这些数字没法放到其他数字的反例呢?没有哦,因为如果\(k\)能放在\([s+1,n]\)的对应位置,那么作为这个数本身的\(x\)一定能放在\(k\)上。所以得到结论:可以直接将\(s\)和\(n\)调换来缩小\(n\)。
代码
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)
#define QUICKIO \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define MS(x,y) memset(x,y,sizeof(x))
using namespace std;
typedef long long ll;
const int MAXN=2018;// actually, max distance: 282
bool mat[MAXN][MAXN];
bool is_prime(int x)
{
if(x<=1) return false;
else for(ll k=2;k*k<=ll(x);++k)
{
if(x%k==0) return false;
}
return true;
}
int linker[MAXN];
bool vis[MAXN];
int n;
bool dfs(int x)
{
rep(i,1,n) if(mat[x][i] && !vis[i])
{
vis[i]=true;
if(linker[i]==-1 || dfs(linker[i]))
{
linker[i]=x;
return true;
}
}
return false;
}
int hungary()
{
MS(linker,-1);
int ans=0;
rep(i,1,n)
{
ZERO(vis); // 注意这一行,应当是每一次清空
if(dfs(i)) ans++;
}
return ans;
}
int main()
{
int T; scanf("%d",&T);
rep(kase, 1, T)
{
int primecnt=0;
int s;
ZERO(mat);
scanf("%d%d", &n, &s);
if(s<n) swap(s,n); // s should be bigger
if(n>1000)
{
printf("Case #%d: No\n", kase);
continue;
}
rep(i,1,n)
{
if(is_prime(s+i)) primecnt++;
if(primecnt>1) break;
}
if(primecnt<=1)
{
rep(i,1,n)
{
int t=s+i;
rep(j,1,n) if(t%j==0)
mat[i][j]=true;
}
if(hungary()!=n)
printf("Case #%d: No\n", kase);
else printf("Case #%d: Yes\n", kase);
}
else printf("Case #%d: No\n", kase);
}
return 0;
}
「国庆训练」Kingdom of Obsession(HDU-5943)的更多相关文章
- 「国庆训练」ArcSoft's Office Rearrangement(HDU-5933)
题目与分析 题解见https://blog.csdn.net/cmershen/article/details/53200922. 训练赛场上我们写出来了--在4小时50分钟的时候...激情补题啊.. ...
- 「国庆训练」Bomb(HDU-5934)
题意 给定\(n\)个炸弹,每个炸弹的坐标与代价与影响范围给定,炸弹会引爆影响范围内其他所有炸弹.求引爆所有炸弹的最小代价. 分析 先做\(n^2\)的循环,然后建图,对\(i\)能引爆\(j\)建边 ...
- 「日常训练」The Intriguing Obsession(CodeForces Round #439 Div.2 C)
2018年11月30日更新,补充了一些思考. 题意(CodeForces 869C) 三堆点,每堆一种颜色:连接的要求是同色不能相邻或距离必须至少3.问对整个图有几种连接方法,对一个数取模. 解析 要 ...
- 「国庆训练&知识学习」图的最大独立集与拓展(Land of Farms,HDU-5556)
题意 一个\(N*M\)的矩阵,其中"."代表空地,"0-9"代表古代建筑,我们如果选择了一个编号的古代建筑想要建立,那么对应就要将全部该编号的建筑建立起来,如 ...
- 「日常训练」 神、上帝以及老天爷 (HDU 2048)
题意 数论中的错排问题.记错排为Dn" role="presentation">DnDn,求Dnn!" role="presentation&q ...
- 「日常训练」 不容易系列之(3)—— LELE的RPG难题 (HDU 2045)
题目简述 有排成一行的n" role="presentation">nn个方格,用红(Red).粉(Pink).绿(Green)三色涂每个格子,每格涂一色,要求任何 ...
- 「日常训练」 Fire!(UVA-11624)
与其说是训练不如说是重温.重新写了Java版本的代码. import java.util.*; import java.math.*; import java.io.BufferedInputStre ...
- 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)
题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...
- 「日常训练」COMMON 约数研究(HYSBZ-1968)
题意与分析 感谢https://www.cnblogs.com/Leohh/p/7512960.html的题解.这题话说原来不在我的训练范围,正好有个同学问我,我就拿来做做.数学果然不是我擅长的啊,这 ...
随机推荐
- js中返回上一页
<a class="btn btn-danger" href="javascript:history.go(-1);">取消</a>
- Mac 开发配置手册
转自:http://www.cocoachina.com/mac/20141112/10198.html 手册内容为「如何让一部全新的 MacBook 快速完成开发环境配置」,主要面向 Web 开发者 ...
- C++重载操作符operator
operator是C++关键字,用于对C++进行扩展: 1.可以被重载的操作符:new,new[],delete,delete[],+,-,*,/,%,^,&,|,~,!,=,<,> ...
- flume data to hdfs
flume 开发梳理 flume 数据到hadoop conf/hdfsAgent.conf #配置sources.channels.sinks a1.sources=r1 a1.channels=c ...
- Unity经验之谈-DoTween动画结束匿名委托之巨坑
产生问题: 成百上千个物体放在List列表里面循环,每个物体都要使用移动和移动结束事件. BUG: 动画结束之后我想隐藏该物体,结果却没有正常的隐藏,代码如下 foreach (var item in ...
- 商业化IM 客户端设计---Message模型
在IM开发中,一个问题是怎么管理传输,包括处理消息发送,消息接受和怎么转发等等,就是上一篇文章提到的IMService扮演的角色.另一个问题就是传输的具体数据是怎么定义的,既包括业务数据(文字,语音, ...
- springBoot+mybatisPlus小demo
项目介绍:采用restful api进行接口规范 / 项目框架SpringBoot+mybatis Plus / 采用mysql进行数据存储 / 采用swaggerUI进行前后端业务分离式开发. 开发 ...
- 02 看懂Oracle执行计划
看懂Oracle执行计划 最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也来总结一下自己最近所学,不定时更新ing… 一:什么是Oracle执行计划? 执行计划是一条查询语句在 ...
- vue-cli使用swiper4在ie以及safari报错
vue-cli项目中,通过npm run swiper --save-dev安装的是swiper4版本的插件,这样安装以后在谷歌火狐等浏览器都可以正常运行,但是在safari浏览器(可能是版本太低)还 ...
- PHP程序员面试中经常被提问的问题【转载】
1. Include 与 require的区别,require和require_once的效率哪个高? Php在遇到include时就解释一次,如果页面中出现10次include,php就解释10次, ...