洛谷P8807 [蓝桥杯 2022 国 C] 取模

题目:

解读(思路与分析):

  1. 题目总结:

  2. 对于给定的整数 n 和范围 m,要找到两个不同的 x y,它们除以 n 后的余数相等。

思路:

对于每组给出的nm询问,可以通过遍历范围从 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),那么根据鸽巢原理,就必然会有至少一个余数重复。

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值