题目:
解读(思路与分析):
-
题目总结:
-
对于给定的整数 n 和范围 m,要找到两个不同的 x 和 y,它们除以 n 后的余数相等。
思路:
对于每组给出的n,m询问,可以通过遍历范围从 1 到 m 的所有可能的 j,并计算 n 对 j 取模的余数。使用一个集合来存储已经出现过的余数,如果当前余数已经存在于集合中,则说明找到了满足条件的 x 和 y。如果遍历完所有可能的 j 后仍然没有找到满足条件的 x 和 y,则输出 "No",否则输出 "Yes"。
代码及解读:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T, n, m;
cin >> T;
while (T--)//循环处理每个变量
{
cin >> n >> m;
bool found = false;//布尔变量,用于标记是否找到相同余数
unordered_set<int> results;//无序集合,用于存储余数
for (int j = 1; j <= m; j++)
{
int result = n % j;//计算n对i取模的余数
if (results.count(result) > 0)//如果余数已经存在于集合中,输出yes
{
cout << "Yes" << endl;
found = true;//更新found为true
break;
}
else
results.insert(result);//将余数插入集合中
}
if (!found)//如果没有找到相同余数,输出no
cout << "No" << endl;
}
return 0;
}
总结:
这个问题涉及到了数论中的余数性质以及鸽巢原理的应用。需要对余数的性质有一定的了解,以及如何通过取模运算来处理问题。但我的代码没有直接地用到鸽巢原理。利用了unordered set来存储计算得到的余数,用于快速查找重复的余数。使用无序集合可以确保不会存储重复的余数,并且能够在 O(1) 时间复杂度内完成查找操作,从而提高了程序的效率。
提一下鸽巢原理:
鸽巢原理的基本思想是,如果有 (n) 只鸽子和 (m) 个鸽巢,当 (n > m) 时,至少有一个鸽巢中有多只鸽子。在数论中,当我们考虑余数时,这个原理同样适用:如果对 (m) 个不同的除数取模运算,那么最多会产生 (m) 种不同的余数(从 0 到 (m-1))。如果除数的数量超过了 (m),那么根据鸽巢原理,就必然会有至少一个余数重复。
标签:取模,P8807,int,余数,蓝桥,鸽巢,集合,原理 From: https://blog.csdn.net/morantneymarstep/article/details/139702084