[日常训练]AekdyCoin的跳棋「建议收藏」

[日常训练]AekdyCoin的跳棋「建议收藏」AekdyCoin正在玩一个游戏,该游戏要用到两副牌和一个数轴和一个棋子。刚开始的时候棋子位于数轴的0位置。然后AekdyCoin交替的从两副牌中抽取一张牌,然后执行相应的动作。设这两幅牌为A

大家好,又见面了,我是你们的朋友全栈君。

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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155010.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python 正则表达式大全[通俗易懂]

    Python 正则表达式大全[通俗易懂]1前言正则表达式是对字符串(包括普通字符(例如,a到z之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。上面都是官方的说明,博主自己的理解是(仅供参考):通过事先规定好一些特殊字符的匹配规则,然后利用这些字符进行组合来匹配各种复杂的字符串场景。比如现在的爬虫和数据分析,字符串校验等等都

    2022年10月3日
    3
  • docker安装elasticsearch 7.6.2「建议收藏」

    docker安装elasticsearch 7.6.2「建议收藏」小伙伴们,你们好呀!我是老寇!安装elasticsearch的教程数不胜数,本文的安装方式是经过自己测试的,因此分享给有需要的小伙伴,一来是避免小伙伴少走弯路,二来方便后面知识的整合。本文是基于ES7.6.2的版本进行安装的,话不多说,我们开始吧。目录一、提前条件二、安装过程1.拉取镜像2.启动容器3.配置文件4.设置密码5.退出容器6.重启容器7.谷歌插件一、提前条件谷歌插件:elasticsearch-head服务器:centos7.5(

    2022年6月6日
    69
  • 知识库名称_个人知识库

    知识库名称_个人知识库创作歌剧《魔笛》的是::莫扎特春分时黄昏时北斗星指向::东方春秋战国时期,法家的代表人是::韩非子春秋战国时期与伯乐齐名的相马高人::方九皋国画名品《泼墨仙人》是谁的作品?:梁楷国际奥林匹克集邮联合会在哪一个国家成立?:瑞士国际奥委会发行的《祝贺北京成为2008年奥林匹克运动会主办城市》的纪念封上,代表北京的图案是::天坛国际奥委会评估团2月底对北京进行

    2022年9月27日
    7
  • linux基本命令_Git常用命令

    linux基本命令_Git常用命令用一个记一个。修改文件权限:chmod777文件名文件夹及其子文件:chmod-R777文件夹

    2022年10月3日
    5
  • 高等数学学习目录

    高等数学学习目录第一章函数与极限第一节映射与函数初等函数双曲函数第二章导数的概念基本初等函数的倒数导数的四则运算第四章不定积分不定积分概念与性质天子骄龙

    2022年8月6日
    11
  • Linux文件操作高频使用命令

    Linux文件操作高频使用命令文章目录0.新建操作:1.查看操作2.删除操作3.复制操作4.移动操作:5.重命名操作:6.解压压缩操作0.新建操作:mkdirabc#新建一个文件夹touchabc.sh#新建一个文件1.查看操作查看目录:ll#显示目录文件详细信息查看文件内容:cat|head|tail命令catabc.txt#查看abc的内容head-5abc.txt#…

    2022年5月1日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号