Divisibility题解

From lyh 学长

2018.5.3 信(liang)心(liang)杯T3

一道略弱的数论题。

 

 

题目描述

给定 n个数,问是否能从中选出恰好 k个数,使得这些数两两之差可以被 m 整除。

输入输出格式

输入格式:

 

第一行输入三个正整数 n,k,m。

接下来一行 n个正整数。

输出格式:

 

若不能选出 k个数,则输出"No "(不包含引号)。

若可以,第一行输出" Yes"(不包含引号),第二行输出 k个正整数,用空格隔开,如果有多种方案,输出字典序最小的方案。

样例一

输入:3 2 3 1 8 4

输出:Yes

      1 4

样例二

输入:3 3 3 1 8 4

输出:No

样例三

输入:4 3 5 2 7 7 7

输出:Yes

     2 7 7

解析

可用简单同余知识来处理然而我考试时是用DP做的。

一道略弱的数论题。

若两数之差被m整除,则这两个数关于m同余。

轻松解出。

复制代码
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     int al[1000002],bl[1000002],cl[1000002],m,n,k,l=0,q;
 5     scanf("%d%d%d",&n,&k,&m);
 6     for(int i=1;i<=n;i++)
 7         scanf("%d",&al[i]);
 8     sort(al+1,al+1+n);
 9     for(int i=1;i<=n;i++)
10         cl[i]=al[i]%m;
11     for(int i=1;i<=n;i++)
12         bl[cl[i]]++;
13     for(int i=1;i<m;i++){
14         if(bl[cl[i]]>=k){
15             cout<<"Yes"<<endl;
16             for(int j=1;j<=n;j++){
17                 if(cl[i]==cl[j]){
18                     printf("%d ",al[j]);
19                     l++;
20                     if(l==k) return 0;
21                 }
22             }
23         }
24     }
25     cout<<"No"<<endl;
26     return 0;
27 }
复制代码

 

 
posted @   buffoons  阅读(154)  评论(0编辑  收藏  举报
编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· 《HelloGitHub》第 106 期
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用
点击右上角即可分享
微信分享提示