Prakul has been working hard setting problems for Codecraft. When he’s deep in thought, he likes jumping around his room in weird but specific ways. After some time, he wonders if jumping in this manner can cover all the tiles of his room.
Prakul’s room can be considered as a grid A consisting of n rows and m columns. He starts walking from A1,1. If he is currently at Ai,j he can do either of the following moves:
- Jump b steps right to Ai,((j+b−1)modm)+1, or
- Jump a steps down to A((i+a−1)modn)+1,j.
A special restriction is that he can start with either move, but must alternate between them.
Note that his room is quite special as it wraps around itself. Moving one step right from the m-th column places him in the 1-st column. Similarly, moving one step down from the n-th row places him in the 1-st row.
Since he still has to work on problemsetting, he needs your help. Determine if he can visit all tiles in A in a finite number of jumps.
Input
Each test contains multiple test cases. The first line contains the number of test cases t (1≤t≤104). The description of the test cases follows.
The only line of each test case contains four integers n,m,a,b (1≤n,m,a,b≤109).
Output
For each test case, print “YES” if Prakul can cover all the tiles of his room, and “NO” otherwise.
You can output the answer in any case (upper or lower). For example, the strings “yEs”, “yes”, “Yes”, and “YES” will be recognized as positive responses.
等价于
∀k,(ka mod n,kb mod m)和((k+1)a mod n,kb mod b)
是否能遍历到[0,n−1]×[0,m−1]的所有点
由于((k+1)a mod n,kb mod b)可看作(ka mod n,kb mod m)的平移,首先讨论(ka mod n,kb mod m)的情况
(ka mod n,kb mod m)#
(ka mod n)和(kb mod m)基本一样,不妨讨论ka mod n的情况
1. ka mod n#
只需讨论∀k∈[0,n−1]的情况,由带余除法性质可知,其他范围皆可通过平移归约到此情况,形式化地解释如下
∀k,∃q,r∈[0,n−1](即n的标准完全剩余系)s.t.k=q⋅n+r故有
ka mod n=ra mod n记k=r则有
∀k∈[0,n−1],ka mod n要使动点能随k变化遍历所有点,则∀k∈[0,n−1],ka mod n要能够表示所有行即[0,n−1],即n的完全剩余系
要满足这个条件,则ka要两两不同余
-
n=1时,能表示0即所有行,满足条件且gcd(a,n)=1
-
n>1时
设∀k1>k2∈[0,n−1]
对于公式
k1a−k2a≡(k1−k2)a(modn)
有0<k1−k2<n
-
gcd(a,n)=1时
假设
(k1−k2)a≡0(modn)
由于gcd(a,n)=1,故a可逆,故有
(k1−k2)a≡0⇔k1−k2≡0(modn)
由完全剩余系的性质可知当且仅当两者相等时才同余,故得
k1=k2
与条件k1>k2矛盾,故有结论
∀k1=k2∈[0,n−1],k1a≡k2a(modn)
故∀k∈[0,n−1],ka mod n两两不同行,又总数有n个行,故其是n的完全剩余系,能表示所有行
-
gcd(a,n)=1
记d=gcd(a,n)>1,有
0<dn<n
故令k1−k2=dn,则此时有
(k1−k2)a≡gcd(n,a)na≡lcm(n,a)≡0(modn)
故有结论,此时[0,n−1]会有dn及其倍数使行重复,又总数只有n个行,故能表示的行<n,不满足条件
故当且仅当gcd(a,n)=1时ka mod n能表示所有行
2. kb mod n#
同理可得当且仅当gcd(b,m)=1时kb mod n能表示所有列
3. (ka mod n,kb mod m)#
即使各自能表示所有行,表示所有列,在遍历k的过程中动点仍有可能重复
考虑(ka mod n,kb mod m)重复的情况,只有
∀k1>k2,{k1a≡k2a(modn)k1b≡k2b(modm)⇔gcd(a,n)=1,gcd(b,m)=1∀k1−k2>0,{k1−k2≡0(modn)k1−k2≡0(modm)记t=k1−k2对于
{t≡0(modn)t≡0(modm)由扩展欧几里得定理解得
t≡0(modlcm(n,m))⇔k1≡k2(modlcm(n,m))由于
∀k,k=q⋅lcm(n,m)+r,0≤r<lcm(n,m)故k可归约为[0,lcm(n,m)−1]即lcm(n,m)的完全剩余系,其余点总能在完全剩余系中找到等价的点,而完全剩余系中的点模lcm(n,m)不同余,故为不同点,总计有lcm(n,m)个不同点,可简单的解释为k→(ka mod n,kb mod m)的映射以lcm(n,m)为最小周期,即当k在[0,lcm(n,m)−1]取值时恰好遍历所有不同点,故共有lcm(n,m)个不同点
4. ((k+1)a mod n,kb mod b)#
由于((k+1)a mod n,kb mod b)可看作(ka mod n,kb mod m)的平移,故也能遍历总计有lcm(n,m)个不同点,那么是否和(ka mod n,kb mod m)重复呢?若有重复点,则
{(k1+1)a≡k2a(modn)k1b≡k2b(modm)⇔gcd(a,n)=1,gcd(b,m)=1{k1+1≡k2(modn)k1≡k2(modm)⇔t=k2−k1{t≡1(modn)t≡0(modm)有解,由裴蜀定理得,要使其有解则
1≡0(modgcd(n,m))⇔gcd(n,m)=1其余情况则无解,与(ka mod n,kb mod m)无重复
5. Conclusion#
-
gcd(n,m)=1时
(ka mod n,kb mod m)能表示lcm(n,m)=gcd(n,m)=1nm个点,故能表示[0,n−1]×[0,m−1]所有点,满足条件
-
gcd(n,m)=1时
((k+1)a mod n,kb mod b)和(ka mod n,kb mod m)可表示总共2×lcm(n,m)个互不相同的点
要使其能遍历[0,n−1]×[0,m−1]所有点则
2×lcm(n,m)≥nm⇔lcm(n,m)nm=gcd(n,m)≤2