链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
T 组数据。
有 n 个硬币,初始都是正面朝上,每次操作你可以选择其中的恰好 m 个,并将它们翻转,你可以执行任意次操作,问能否将所有硬币都变成反面朝上?
这个题你是不是觉得很简单,比如你想象n%m==0是否可以实现,但是事实好像不是这样的,因为5和3也可以做到一定的翻转,这样子就不行了,到是有一种简单的方法,如果你学过数论里面的欧几里得公式ax+by=gcd(a,b)就可能瞬间理解了,就是说我要翻x次,一共翻了m个,而多余的必须为2的倍数,这里很好看,因为给出了一个数据5和3,那么xm=2y+N,也就是xm-2y=N同样适用于gcd(m,2);根据裴蜀定理N为gcd(m,2)的倍数就可以解决了,还有种方法我在想没想出来,但这却是最简单的一种,考察你的知识储备;
刚刚与我们同学探讨了一个比如15的话,13,11,9,7,5,3,1就可以,这就可以写一个公式进行验算
#include <iostream>
#include <algorithm>
#include <numeric>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
long long n, m;
cin >> n >> m;
if (n % gcd(m, 2) == 0) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}