rollover

看到这个题目就想到要用暴搜

但是n,m,k<=100000;

所以肯定不是

经过一番痛苦的思考

终于发现了一个惊天大秘密

如果a[i]%m==a[j]%m

则(a[i]-a[j])%m==0;

所以a[i],a[j]就可以放在一组;

哈哈哈哈哈,此题破矣;

标程如下:

#include<bits/stdc++.h>
using namespace std;
long long n,k,m,a[100010],b[100010],q=100010,sum=0;
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]+=1;
	}
	for(int i=0;i<m;i++)
	{
		if(b[i]>=k)
		{
			cout<<"Yes"<<endl;
			q=i;
			break;
		}
	}
	if(q==100010)
	{
		cout<<"No";
		return 0;
	}
	for(int i=1;i<=n;i++)
	{
		if(a[i]%m==q)
		{
			if(sum<k)
			{
		        cout<<a[i]<<" ";
		        sum+=1;
		    }
		    else
		    break;
	    }
	}

  

猜你喜欢

转载自www.cnblogs.com/xsxbqsjxj/p/11185321.html