题目 2701: 蓝桥杯2022年第十三届决赛真题-取模(C/C++/Java组)
时间限制: 3s 内存限制: 512MB 提交: 6633 解决: 1263
题目描述
给定 n, m ,问是否存在两个不同的数 x, y 使得 1 ≤ x < y ≤ m 且 n mod x = n mod y 。
输入格式
输入包含多组独立的询问。
第一行包含一个整数 T 表示询问的组数。
接下来 T 行每行包含两个整数 n, m,用一个空格分隔,表示一组询问。
输出格式
输出 T 行,每行依次对应一组询问的结果。如果存在,输出单词 Yes;如果不存在,输出单词 No。
样例输入复制
3
1 2
5 2
999 99
样例输出复制
No
No
Yes
提示
对于 20% 的评测用例,T ≤ 100 ,n, m ≤ 1000;
对于 50% 的评测用例,T ≤ 10000 ,n, m ≤ 105;
对于所有评测用例,1 ≤ T ≤ 105 ,1 ≤ n ≤ 109 ,2 ≤ m ≤ 109。
1.分析
1.对于偶数,m>=2就行,x为1,y为2。
2.对于奇数,循环找到x,y。记录余数的个数,为2的话就break。
3.用scanf可以过,cin不能过。
2.代码
cpp
#include<iostream>
#include<map>
using namespace std;
typedef long long LL;
const int MAX = 1e5 + 10;
int n, m,T;
bool check(int x) {
map<int, int> s;
for (int i = 1; i <= m; i++) {
s[n % i]++; //记录余数个数
if (s[n % i] >= 2) { //直接结束
return true;
}
}
return false;
}
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &m);
if (n % 2 == 0) {
if (m >= 2) printf("Yes\n");
else printf("No\n");
}
else {
if (m>=23||check(n)) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}