题意

给定\(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)的更多相关文章

  1. 「国庆训练」ArcSoft's Office Rearrangement(HDU-5933)

    题目与分析 题解见https://blog.csdn.net/cmershen/article/details/53200922. 训练赛场上我们写出来了--在4小时50分钟的时候...激情补题啊.. ...

  2. 「国庆训练」Bomb(HDU-5934)

    题意 给定\(n\)个炸弹,每个炸弹的坐标与代价与影响范围给定,炸弹会引爆影响范围内其他所有炸弹.求引爆所有炸弹的最小代价. 分析 先做\(n^2\)的循环,然后建图,对\(i\)能引爆\(j\)建边 ...

  3. 「日常训练」The Intriguing Obsession(CodeForces Round #439 Div.2 C)

    2018年11月30日更新,补充了一些思考. 题意(CodeForces 869C) 三堆点,每堆一种颜色:连接的要求是同色不能相邻或距离必须至少3.问对整个图有几种连接方法,对一个数取模. 解析 要 ...

  4. 「国庆训练&知识学习」图的最大独立集与拓展(Land of Farms,HDU-5556)

    题意 一个\(N*M\)的矩阵,其中"."代表空地,"0-9"代表古代建筑,我们如果选择了一个编号的古代建筑想要建立,那么对应就要将全部该编号的建筑建立起来,如 ...

  5. 「日常训练」 神、上帝以及老天爷 (HDU 2048)

    题意 数论中的错排问题.记错排为Dn" role="presentation">DnDn,求Dnn!" role="presentation&q ...

  6. 「日常训练」 不容易系列之(3)—— LELE的RPG难题 (HDU 2045)

    题目简述 有排成一行的n" role="presentation">nn个方格,用红(Red).粉(Pink).绿(Green)三色涂每个格子,每格涂一色,要求任何 ...

  7. 「日常训练」 Fire!(UVA-11624)

    与其说是训练不如说是重温.重新写了Java版本的代码. import java.util.*; import java.math.*; import java.io.BufferedInputStre ...

  8. 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)

    题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...

  9. 「日常训练」COMMON 约数研究(HYSBZ-1968)

    题意与分析 感谢https://www.cnblogs.com/Leohh/p/7512960.html的题解.这题话说原来不在我的训练范围,正好有个同学问我,我就拿来做做.数学果然不是我擅长的啊,这 ...

随机推荐

  1. .Net Core SignalR 初体验

    前言 Asp.Net SignalR已经出来很久了,但是一直没有静下心来好好看看.昨天花了几个小时的时间看了下.首先借鉴了官方文档,如何搭建一个SignalR的Demo. 参考文章:https://d ...

  2. 数据元&数据字典&元数据

    1. 数据元 data element(数据元素),单个数据单元,是数据的基本单位.参阅data field(数据字段). 2. 元数据 首先,我们举个例子来看看什么叫做“元”,在后现代主义文学中有一 ...

  3. Pyplot教程(深度学习入门3)

    源地址:http://matplotlib.org/users/pyplot_tutorial.html .caret, .dropup > .btn > .caret { border- ...

  4. 工程命名为***&***出现的问题: LaunchScreen.xib: Line 20: EntityRef: expecting ';'

    今天新建一个项目命名为28 & 29. extern&static,  然后cmd + R运行,居然碰到了编译错误. 当时就奇怪了,怎么会这样呢?报错内容如下: 开始还以为新安装的Xc ...

  5. 自学安卓练习作品单词APP(1)-安卓的hello word与有道字典防爬虫破解

    1.前言 闲来无聊.手机每天又是都接触的东西.程序什么的最容易接触到.想到有些人说前后端都做就是全栈的说法.哦,你看html5全栈. 要我说多接触一些多有意思.天天写后端.还不是业务层.又不是什么高大 ...

  6. Hadoop 学习之——HDFS

    HDFS是HADOOP中的核心技术之一——分布式文件存储系统.Hadoop的作者Doug Cutting 和Mike 是根据Google发布关于GFS 的研究报告所设计出的分布式文件存储系统. 一.H ...

  7. js 中 函数的返回值问题

    var result=''; function searchByStationName( address ) { // map.clearOverlays();//清空原来的标注 var keywor ...

  8. JavaScript数组处理方法

    JavaScript中创建数组有两种方式 (一)使用 Array 构造函数: var arr1 = new Array(); //创建一个空数组 var arr2 = new Array(20); / ...

  9. 协作开发中常用的Git命令小结

    先提一下最基础的git命令用法: git clone   从远端克隆到本地仓库 git add . (注意add和. 之间有一个空格)将全部改动添加到暂存区 git checkout xxx 撤销更改 ...

  10. mysql 8.0.12 日常出错

    最近不知道怎么回事,数据库老是会输出一个: [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and co ...