[模拟赛] Divisibility 数论
Posted jackpei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[模拟赛] Divisibility 数论相关的知识,希望对你有一定的参考价值。
Divisibility
给定n个数,问是否能从中选出恰好k个数,使得这些数两两之差可以被m整除。
【输入格式】
第一行输入三个正数n,k,m。
接下来一行n个数。
【输出格式】
若不能选出k个数,则输出"No"(不包含引号)。
若可以,第一行输出"Yes"(不包含引号),第二行输出k正整数,用空格隔开,如果有多种方案,输出字典序最小的方案。
【数据规模与约定】
对于1~3的测试点:n<=20
对于4~7的测试点:n,m<=3000
对于8~10的测试点:k<=n<=10^6,m<=10^6,ai<=10^9
from 学长LYH
(a-b)%p=0 => a%p=b%p 然后把同余的存起来瞎搞就行了。。。话说multiset为何如此慢。。。好像sort一下就行。。。
#include<cstdio> #include<iostream> #include<set> #define pc(x) putchar(x) #define R register int using namespace std; inline int g() { R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch==‘-‘?-1:fix; do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix; } int n,k,m,lst=0x3f3f3f3f,mn; multiset<int>s[1000001]; bool flg; signed main() { freopen("divisibility.in","r",stdin); freopen("divisibility.out","w",stdout); n=g(),k=g(),m=g(); for(R i=1,x;i<=n;++i) x=g(),s[x%m].insert(x); for(R i=0,tmp;i<m;++i) if(s[i].size()>=k&&(tmp=*s[i].begin(),tmp<lst)) flg=true,lst=tmp,mn=i; R cnt=1; if(flg) { pc(‘Y‘),pc(‘e‘),pc(‘s‘),pc(‘ ‘); for(multiset<int>::iterator it=s[mn].begin();cnt<=k;++cnt,++it) printf("%d ",*it); } else pc(‘N‘),pc(‘o‘),pc(‘ ‘); }
2019.04.18
以上是关于[模拟赛] Divisibility 数论的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces - 550C Divisibility by Eight
Codeforces Round #486 (Div. 3)988E. Divisibility by 25技巧暴力||更暴力的分类