[日常训练]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 ...
随机推荐
- finereport---FineReport入门常见疑难点
一.入门介绍 二.入门需知 注意:开发人员可以设置DEBUG级别,有助于测试 三.数据准备 数据集sql中可以使用参数宏${}动态地生成过滤条件,${}中的语句在FineReport报表中执行,将${ ...
- PLSQL Developer在未安装Oracle Client情况下连接Oracle
常用的Oracle开发的工具有SQL Developer和PL/SQL Developer, 用PL/SQL连接oracle数据库,不管是本地的还是远程的,一般都需要安装oracle客户端 如何达到不 ...
- submit按钮修改宽高的坑
近些天对h5非常感兴趣,边工作边学习,虽然比较累,但过得很踏实.每天都要学习一点东西,这样才能对得起自己.好了,废话不多说,进入今天的主题. 今天遇到了一个非常有趣的东西,就是在修改submit按钮的 ...
- https://www.cnblogs.com/yuanchenqi/articles/6755717.html
知识预览 一 进程与线程的概念 二 threading模块 三 multiprocessing模块 四 协程 五 IO模型 回到顶部 一 进程与线程的概念 1.1 进程 考虑一个场景:浏览器,网易云音 ...
- JavaScript dotAll模式
JavaScript正则表达式中点(.)是一个特殊字符,它可以匹配除了一下条件的任意字符. 四个字节的UTF-16字符 换行符(\n) 回车符(\r) 行分隔符 段分隔符 为了使点(.)可以匹配任意字 ...
- 服务不支持 chkconfig 的解决方法
系统服务,在chkconfig --add servername的时候老是提示服务不支持 chkconfig,经过查找,解决办法如下. 示例,auto_run的前三行如下:#!/bin/sh#chk ...
- caffe使用(2)
总体流程 https://blog.csdn.net/hjimce/article/details/48933813 https://zhuanlan.zhihu.com/p/24087905 1.编 ...
- Making the Grade---poj3666(类似离散化+dp)
题目链接:http://poj.org/problem?id=3666 题意是给出一组数,每个数代表当前位置的地面高度,问把路径修成非递增或者非递减,需要花费的最小代价? ///用dp[i][j]表示 ...
- pandas数据结构和介绍第一天
pandans另种主要的数据结构Series和DateFranme 1,Series 仅由一组数据就而已产生简单的Series 2)Series 有index和values属性,表达索引对象 3)设置 ...
- Vue(7)- vue-cookies、极验滑动验证geetest、vue-router的导航守卫
一.vue-cookies 参考文档简书:https://www.jianshu.com/p/535b53989b39 参考文档npm:https://www.npmjs.com/package/vu ...