翻车
题目
【问题描述】
有一天,小武找到了翻车王,给了他n个整数a1,a2,a3,…an,翻车王
需要选择其中的k个数,使得选出的k个数中任意两个的差都可以被m整除。
选出的数可以重复,但不可以超过这n个数中该数的个数。
翻车王不想翻车,所以需要你的帮助。
【输入格式】
第一行包括3个整数n,k,m(2 ≤ k ≤ n ≤ 100000,1 ≤ m ≤ 100000),
n,k,m意义见题面。
第二行包括n个数a1,a2,a3,…an(0 ≤ ai ≤ 1000000000)。
【输出格式】
如果不可以选出k个数,使得选出这k个数中任意两个的差都可以被m整
除,那么输出“No”。
否则,在第一行输出“Yes”。在第二行输出这k个整数b1,b2,...bk
(所选的数字),两两数之间有一个空格。如果有多种选择k个数字的方案,
请输出任意一种。
【输入输出样例】
输入
4 3 5
2 7 7 7
输出
Yes
2 7 7
思路:
首先,我们想到,其实(x-y)%m==0就等价于x≡y(mod m),所以我们可以先把ai存起来,再通过他们模m用桶排,找到符合要求的一组数,输出k个。
代码:
#include<bits/stdc++.h> using namespace std; int n,m,k,a[100001],b[100000],t; int main() { freopen("rollover.in","r",stdin); freopen("rollover.out","w",stdout); cin>>n>>k>>m; for(int i=1;i<=n;i++) { cin>>a[i]; b[a[i]%m]++; } for(int i=0;i<m;i++) { if(b[i]>=k) { cout<<"Yes"<<endl; for(int j=1;j<=n;j++) { if(a[j]%5==i) { t++; cout<<a[j]<<" "; if(t==k) return 0; } } cout<<endl; return 0; } } cout<<"No"<<endl; return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理