• 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 }
     
  • 相关阅读:
    分布式日志收集系统:Facebook Scribe
    Python学习笔记 02 Python基础
    Python正则表达式指南
    在ASP.NET 2.0中操作数据教程系列
    sql server2005 分页特性
    UML学习
    is,as,sizeof,typeof,GetType
    viso,PowerDesigner,Rational Rose比较
    领导艺术-八项管理定律
    一个博士,一个研究生,和一个MBA对一碗牛肉面的思考(转)
  • 原文地址:https://www.cnblogs.com/wzyzxy/p/9321441.html
Copyright © 2020-2023  润新知