链接:https://ac.nowcoder.com/acm/contest/3782/B
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给定两个正整数n,m。问能否构造出一个长度为n的字符串s[0..n-1],满足以下两个条件:

1. 对于n的任意正因数d(d<n),d不是s的周期。

2. 对于∀i∈[0,m-1],s[i mod n]=s[(i+m) mod n]。

输入描述:

输入包含多组数据。

第一行包括一个正整数T。

接下来T行,每行包括两个正整数n,m。

输出描述:

对于每组数据输出一行。若能构造出符合条件的字符串,输出“Yes”,否则输出“No”。(均不含引号)

示例1

输入

复制

7
1 3
3 5
3 6
7 2
6 3
10 6
10 8

输出

复制

Yes
No
Yes
Yes
No
Yes
No

说明

 

第一组:s="a"满足题意

第二组:需要满足s[0]=s[(0+5) mod 3]即s[0]=s[2]、s[1]=s[(1+5) mod 3]即s[1]=s[0]。故s[0]=s[1]=s[2],1是s的周期,不合题意。

第三组:s="abc"满足题意

第四组:s="ababccc"满足题意

第五组:需要满足s[0]=s[3],s[1]=s[4],s[2]=s[5]。故3是s的周期,不合题意。

第六组:s="abcdababcd"满足题意

第七组:需要满足s[0]=s[8],s[1]=s[9],s[2]=s[0],s[3]=s[1],s[4]=s[2],s[5]=s[3],s[6]=s[4],s[7]=s[5],即s[0]=s[2]=s[4]=s[6]=s[8],s[1]=s[3]=s[5]=s[7]=s[9]。故2是s的周期,不合题意。

备注:

 

T=1*106

1≤n,m≤1018

可以认为字符集的大小大于n。

字符串周期的定义:

对于字符串s[0..l-1],若正整数t满足对于∀i∈[0,l-t-1],s[i]=s[i+t],则称t为字符串s的周期。

本题输入规模较大,请使用较快的读入方式或者使用以下读入模板:

inline long long read() {

    long long tmp=0, fh=1; char c=getchar();

    while (c<'0'||c>'9') {if (c=='-') fh=-1; c=getchar();}

    while (c>='0'&&c<='9') tmp=tmp*10+c-48, c=getchar();

    return tmp*fh;

}

用法:

long long n=read(), m=read();

 

n > m时,发现如果n - m <= gcd(n, m) 不合题意。n < m时,发现只有m % n == 0时才符合题意。

综合以上:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

typedef long long ll;
const int N = 1e5 + 5;

inline long long read()
{
    long long tmp=0, fh=1;
    char c=getchar();
    while (c<'0'||c>'9')
    {
        if (c=='-')
            fh=-1;
        c=getchar();
    }
    while (c>='0'&&c<='9')
        tmp=tmp*10+c-48, c=getchar();
    return tmp*fh;
}

ll gcd(ll a, ll b)
{
    return b?gcd(b, a%b):a;
}

int main()
{
    ll n, m, t;
    t = read();
    while(t--)
    {
        n = read();
        m = read();
        if((m % n == 0) || gcd(n, m) < (n - m))    ///m % n == 0要加上括号,亲测会WA
        {
            cout<<"Yes"<<'\n';
        }
        else
        {
            cout<<"No"<<'\n';
        }
    }
    return 0;
}