HDU5943 Kingdom of Obsession 题解
题意
有 \(n\) 个数 \(s+1\ldots s+n\),求是否能将这 \(n\) 个数放到 \(1\ldots n\) 上,且当令原数为 \(x\),放到 \(y\) 位置时有 \(x \mod y=0\)。
不超过 \(100\) 组数据,\(1\le n \le 10^9,0\le s\le 10^9\)。
题解
看上去很吓人的数据范围,也是一个让你以为这是结论题的数据范围。
但是仔细观察可以发现,当 \(s+1\ldots s+n\) 中有 \(2\) 个及以上质数时,只有将他们安排到 \(1\) 位置或者质数自身位置才有 \(x\mod y=0\)。
首先尝试将这两个质数安排到其自身的位置,这要求 \([s+1,s+n]\cap [1,n]\neq \varnothing\),即要求 \(s<n\)。
那么此时 \([s+1,n]\) 就能够安排到自己的位置了,那么就只剩下 \([n+1,s+n]\) 和 \([1,s]\) 了,可以发现这就是 \(s\) 和 \(n\) 交换后的结果。
但是,当 \(s\) 与 \(n\) 交换后,或者 \(s\) 与 \(n\) 不能交换时,存在 \(2\) 个或以上质数,那么显然无解了。另外,根据结论,在 \([2,10^9]\) 范围内,大约 \(300\) 个数就会出现一次质数,这里保险起见设 \(1000\) 个数出现一次质数。
这里又有一个很神奇的问题,ans+=can[i] 前面不能加 if(!match[i]),具体原因未知。
代码
#include<cstdio>
#include<algorithm>
#include<cstring>
const int MAXN=2000+5;
int n,s,match[MAXN],ver,vis[MAXN];
bool can(int x)
{
vis[x]=ver;
for(int i=1;i<=n;i++)
if((s+x)%i==0 && (!match[i]||(vis[match[i]]!=ver&&can(match[i]))))
{
match[i]=x;
return 1;
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
for(int t=1;t<=T;t++)
{
memset(vis,0,sizeof(vis));
memset(match,0,sizeof(match));
scanf("%d %d",&n,&s);
if(s<n) std::swap(n,s);
if(n>1000)
{
printf("Case #%d: No\n",t);
continue;
}
int ans=0;
for(int i=1;i<=n;i++)
{
ver=i;
ans+=can(i);
}
printf("Case #%d: %s\n",t,ans==n?"Yes":"No");
}
return 0;
}
HDU5943 Kingdom of Obsession 题解的更多相关文章
- hdu5943 Kingdom of Obsession 二分图+打表找规律
题目传送门 Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- hdu 5943 Kingdom of Obsession 二分图匹配+素数定理
Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))
Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- 「国庆训练」Kingdom of Obsession(HDU-5943)
题意 给定\(s,n\),把\(s+1,s+2,...,s+n\)这\(n\)个数填到\(1,2,...,n\)里,要求\(x\)只能填到\(x\)的因子的位置(即题目中\(x\%y=0\)那么x才能 ...
- HDU 5943 Kingdom of Obsession
题意:n个人编号为[s+1, s+n],有n个座位编号为[1,n],编号为 i 的人只能坐到编号为它的约数的座位,问每个人是否都有位置坐. 题解:由于质数只能坐到1或者它本身的位置上,所以如果[n+1 ...
- [HDOJ5943]Kingdom of Obsession(最大匹配,思路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5943 题意:n个人编号为[s+1,s+n],有n个座位编号为[1,n],编号为i的人只能坐到编号为它的 ...
- HDU 5938 Kingdom of Obsession(数论 + 二分图匹配)
题意: 给定S,N,把S+1,S+2,...S+N这N个数填到1,2,...,N里,要求X只能填到X的因子的位置.(即X%Y=0,那么X才能放在Y位置) 问是否能够放满. 分析:经过小队的分析得出的结 ...
- 【HDOJ5943】Kingdom of Obsession(数论)
题意:给定n个人,n个座位,人的编号是[1,n],座位的编号是[s+1,s+n],编号为i的人能坐在编号为j的座位上的条件是j%i=0 问是否存在一组方案使得座位和人一一对应 n,s<=1e9 ...
- hdu 5943(素数间隔+二分图匹配)
Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
随机推荐
- 吴裕雄 python 神经网络——TensorFlow TFRecord样例程序
import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_dat ...
- Numpy中rot90函数实现矩阵旋转
从NumPy的官方完整查到rot90函数语法格式如下: rot90(m, k=1, axes=(0, 1) m是要旋转的数组(矩阵),k是旋转的次数,默认旋转1次,那是顺时针还是逆时针呢?正数表示逆时 ...
- Linux kali安装chromium
打开终端,输入以下命令 apt-get install chromium chromium-l10n
- slice 、 substr 、replace
slice( 参数1 [,参数2] ) (注意不要让[参数1]下标越过[参数2]下标,否则会得到空字符串,且[参数2]是不包含在截取范围内的) 参数1:截取字符的[起始下标]. 值为正 ...
- mysql事务隔离分析
首先说明下,这里主要内容为整理总结网络搜索的零散信息. 写在最前面,mysql事务是在Innodb引擎中得以实现的,如果这点不了解的话,请自行了解. 事务直接数据的可见性通过MVCC(多版本并发控制) ...
- broadcom sdk command
1.查看端口link状态 BCM.0>ps 2.查看vlan BCM.0>vlan show 3.查看pvlan BCM.0>pvlan show 4.CPU发包 BCM.0> ...
- 八 Struts2访问Servlet的API方式三:接口注入
Struts2访问Servlet的API方式三:接口注入 通过实现ServletRequestAware, ServletContextAware 接口,拿到Request.ServletContex ...
- C# Lambda排序
1.按照多个字段进行排序:xxxList.OrderBy(c => c.RoadCode).ThenBy(c => c.Qdzh),表示先按照RoadCode字段进行排序再按照Qdzh字段 ...
- linux服务器自动备份与删除postgres数据库数据
1.先创一个back.sh 文件,授权,然后在下面这个文件添加脚本 export PGPASSWORD='123456' #这是登录服务器密码cur_time=`date +%Y%m%d ...
- Balanced Lineup -POJ3264
题意: 告诉你n头奶牛的高度,然后给你一个区间,你需要求出这个区间最高的奶牛与最矮的奶牛之间相差多少 链接:http://poj.org/problem?id=3264 思路: 线段树区间查询,用两个 ...