[日常训练]AekdyCoin的跳棋
Description
$AekdyCoin$正在玩一个游戏,该游戏要用到两副牌和一个数轴和一个棋子。
刚开始的时候棋子位于数轴的$0$位置。然后$AekdyCoin$交替的从两副牌中抽取一张牌,然后执行相应的动作。
设这两幅牌为$A,B$。每张牌上面有一个整数$x$,表示$AekdyCoin$可以前进的格数。从$A$中抽牌,则必须向左走$x$个单位;从$B$中抽牌则必须向右走$x$个单位。
现在要求第一次必须从$A$中抽牌,且必须轮流从两幅牌中抽,即抽完$A$后必须抽$B$,抽完$B$后必须抽$A$。
$AekdyCoin$在玩这个游戏的时候想到了一个问题,如果数轴是无限的,那么棋子有无可能到达任意的整数点呢?
Input
第一行有一个整数$T(1\;\leq\;T\;\leq\;5)$代表有$T$组数据。
每组数据的格式如下:
开头给出$A$牌中的牌数量$N$。然后接下去有$N$个数,代表$A$牌中各个牌上面标的整数。
而后给出$B$牌中的牌数量$M$。然后接下去有$M$个数,代表$B$牌中各个牌上面标的整数。
Output
对于每组测试点输出$YES$或者$NO$来代表题目给出的问题。
Sample Input
2
1 1
1 3
2 1 3
1 2
Sample Output
NO
YES
HINT
$1\;\leq\;N,M\;\leq\;10^5$;牌上面的整数在$[1,10^9]$之间。
Solution
跳的顺序为$ABABAB......$
- 跳偶数步
构造序列$c=\{x|x=-a_i+b_j\}$,
则一个$AB$可以看成从$c$中选择一个元素来跳.
$c$能到达的任何一个数记为:$k=x_1c_1+x_2c_2+...+x_nc_n$,则$k$所能表示的最小正整数为$gcd(c)$,即所有非负$gcd(c)$的倍数都能到达.
然后$c$中必须有正数和负数才能到达数轴上所有$gcd(c)$的倍数的点.
- 跳奇数步
因为跳偶数步只能遍历数轴上所有$gcd(c)$的倍数的点,所以$a_i\;mod\;gcd(c)$要满足取遍[1,gcd(c)),这样才能将数轴剩下的点都跳到.
$gcd(c)=gcd(a_i-b_k,a_j-b_k...)$.
$a_i-b_k-(a_j-b_k)=a_i-a_j$,整除$gcd(c)$.
这说明$a$关于模$gcd(c)$同余.
- 结论
若$c$里面都是非正或者非负,则$NO$;
若$gcd(c)=1$,则$YES$;
若$gcd(c)=2$,且$a_i\;mod\;2=1$,则$YES$,否则$NO$;
若$gcd(c)>2$,则根据$a$关于$gcd(c)$同余可知,$a_i\;mod\;gcd(c)$不可能取遍[1,gcd(c)),所以$NO$.
- 计算$gcd(c)$
$c_{i,j}=-a_i+b_j=(b_j-b_1)+(b_1-a_1)+(a_1-a_i)$.
只需计算$gcd(b_j-b_1,b_1-a_1,a_1-a_i)$.
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 100005
using namespace std;
typedef long long ll;
int a[N],b[N],n,m,k,t;
bool flag;
inline int gcd(int x,int y){
if(x<0) x=-x;
if(y<0) y=-y;
int r=x%y;
while(r){
x=y;y=r;r=x%y;
}
return y;
}
inline void Aireen(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
a[1]=0;
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=1;i<=m;++i)
scanf("%d",&b[i]);
sort(a+1,a+1+n);
sort(b+1,b+1+m);
if((ll)(b[1]-a[n])*(ll)(b[m]-a[1])>=0ll){
puts("NO");continue;
}
if(b[1]!=a[1]) k=gcd(b[1]-a[n],b[1]-a[1]);
else k=b[1]-a[n];
for(int i=1;i<=n;++i)
if(a[i]!=a[1]) k=gcd(k,a[i]-a[1]);
for(int i=1;i<=m;++i)
if(b[i]!=b[1]) k=gcd(k,b[i]-b[1]);
if(k==1||(k==2&&(a[1]&1))){
puts("YES");continue;
}
puts("NO");
}
}
int main(){
freopen("draughts.in","r",stdin);
freopen("draughts.out","w",stdout);
Aireen();
fclose(stdin);
fclose(stdout);
return 0;
}
[日常训练]AekdyCoin的跳棋的更多相关文章
- 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)
题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...
- 「日常训练」 Fire!(UVA-11624)
与其说是训练不如说是重温.重新写了Java版本的代码. import java.util.*; import java.math.*; import java.io.BufferedInputStre ...
- 「日常训练」COMMON 约数研究(HYSBZ-1968)
题意与分析 感谢https://www.cnblogs.com/Leohh/p/7512960.html的题解.这题话说原来不在我的训练范围,正好有个同学问我,我就拿来做做.数学果然不是我擅长的啊,这 ...
- 「日常训练」 Mike and Fun (CFR305D2B)
题意(CodeForces 548B) 每次对01矩阵中的一位取反,问每次操作后,单列中最长连续1的长度. 分析 非常非常简单,但是我当时训练的时候WA了四次...无力吐槽了,人间 不值得.jpg 代 ...
- 「日常训练」Common Subexpression Elimination(UVa-12219)
今天做的题目就是抱佛脚2333 懂的都懂. 这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的. 思路分析 做这条题我是先按照之前的那条题目(The SetSt ...
- 集训队日常训练20181117 DIV2
大佬们一顿操作猛如虎,拼命AC强啊 4262: 区间异或 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal ...
- [日常训练]string
Description 给定一个长度为$n$的字符串,串中的字符保证是前$k$个小写字母.你可以在字符串后再添加$m$个字符,使得新字符串所包含的不同的子序列数量尽量多.当然,前提是只能添加前$k$个 ...
- [日常训练]yayamao的神题
Description $yayamao$是数学神犇,一天他在纸上计算起了$1/P$, 我们知道按照模拟除法可以得到准确解,例如$1/7=0.(142857),1/10=0.1(0)$.$yayama ...
- [日常训练]mod
Description 给定$p_1,p_2,-,p_n,b_1,b_2,...,b_m$, 求满足$x\;mod\;p_1\;\equiv\;a_1,x\;mod\;p_2\;\equiv\;a_2 ...
随机推荐
- where case 使用
1 traceroleid表数据 tracerleid 表放着角色的相关信息, 角色ID 角色类型 密码 2 traceaccountmap表数据 表中存放着客户号和 其他角色的关系 tracerol ...
- Java方法区和永久代
Java方法区和永久代 目前有三大Java虚拟机:HotSpot,oracle JRockit,IBM J9. JRockit是oracle发明的,用于其WebLogic服务器,IBM JVM是IBM ...
- javascript教程2:---DOM操作
1.DOM 简介 当页面加载时,浏览器会创建页面的文档对象模型(Document Object Model).文档对象模型定义访问和处理 HTML 文档的标准方法.DOM 将 HTML 文档呈现为带有 ...
- Android View体系 系列文章
http://www.cnblogs.com/Free-Thinker/p/6768783.html
- Android图片加载框架Picasso最全使用教程2
前言 前面我们已经介绍了Picasso的基本用法及如何将一张图片加载到ImageView中,下面我们就利用Picasso在ListView中加载图片;Let’s Go! 一个ListView的简单应用 ...
- React:快速上手(3)——列表渲染
React:快速上手(3)——列表渲染 使用map循环数组 了解一些ES6 ES6, 全称 ECMAScript 6.0 ,是 JaveScript 的下一个版本标准,2015.06 发版.ES6 主 ...
- HZNUOJ 2508:双峰插云
我们注意到总的颜色种类只有200,故我们可以先处理出所有云朵中每一种颜色有多少朵云朵拥有,此处我们约定用$cnt[] 表示$ 然后暴力枚举将哪朵云分给老薛,记录三个临时变量$Max_{kk}, Max ...
- Javascript 小数保留2位
1.字符串截取法 function get(){ var s = 22.127456 + ""; var str = s.substring(0,s.indexOf(& ...
- JS中的正则应用
如果还未掌握正则基础知识可先看另一篇:正则笔记-忘记就来看 创建方法: 直接量语法:/pattern/attributes 创建 RegExp 对象的语法:new RegExp(pattern, at ...
- Ubuntu16.04安装Appium
准备工作 1.安装Node 下载地址:https://nodejs.org/en/download/ 下载完后解压,设置环境变量 配置Node环境变量$sudo vim /etc/profile 在文 ...