题意

给定\(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. JavaScript小游戏--2048(程序流程图)

  2. JAVA Collections常用方法

    /* 集合框架的工具类 Collections: */ import java.util.*; class Test { public static void main(String [] args) ...

  3. iOS一个很好的内存检测工具

    虽然Xcode提供了instrument来检测内存,但是使用起来怎么看都很麻烦.然后有一个很不错的内存泄露的检测工具MLeaksFinder,使用的话不需要注入任何代码,直接导入库就行了.出现泄露的时 ...

  4. linux nginx 配置php

    linux nginx 配置php   下载php源码 解压 configure ./configure --prefix=/usr/local/php --enable-fpm --with-mcr ...

  5. Java 内部类综述

    转载自:https://blog.csdn.net/justloveyou_/article/details/53245561

  6. Xcode菜单功能中文翻译

    Xcode菜单功能中文翻译 File  文件 Edit  编辑 View 视图 Navigate 导航 Editor 编辑 Product 产品 Window  窗口 Help 帮助 File  文件 ...

  7. linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别(一)

    分析linux内存管理机制,离不了上述几个概念,在介绍上述几个概念之前,先从<深入理解linux内核>这本书中摘抄几段关于上述名词的解释: 一.<深入理解linux内核>的解释 ...

  8. Web—06-JavaScript

    JavaScript介绍 JavaScript是运行在浏览器端的脚步语言,JavaScript主要解决的是前端与用户交互的问题,包括使用交互与数据交互. JavaScript是浏览器解释执行的,前端脚 ...

  9. js中哪些值会被认为false?

    在javascript中,只有 false null undefined 空字符串 即 “” 数字  0 数字 NaN 会被当作false,其余都是真. 注:字符串 “false” 也会被当作真.

  10. 第一个electron

    1 开发环境:node环境 2 下载electron:npm install electron --save-dev 3 package.json配置如下: { "name": & ...