Find a multiple POJ - 2356

原题链接
考察:抽屉原理+思维
思路:
  一共n个数,如果存在%n==0的数,那么直接输出.如果不存在,余数在1~n-1之间有n个数.根据抽屉原理,必然存在两个余数相等的数(但不一定存在两个相加==n的数).余数相等有什么用呢?说明(r-l)%n == 0.这里就可以用前缀和求解.

Code

#include <iostream>
#include <cstring>
#include <cstdio> 
using namespace std;
const int N = 10010;
int cnt[N],n,sum[N],a[N];
void solve()
{
	for(int i=1;i<=n;i++)
	{
		if(sum[i]%n==0)
		{
			printf("%d\n",i);
			for(int j=1;j<=i;j++)
			  printf("%d\n",a[j]);
			break;
		}
		if(cnt[sum[i]%n])
		{
			printf("%d\n",i-cnt[sum[i]%n]);
			for(int j=cnt[sum[i]%n]+1;j<=i;j++)
			  printf("%d\n",a[j]);
			break;
		}
		cnt[sum[i]%n] = i;
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		sum[i] = sum[i-1]+a[i];
	}
	solve();
	return 0;
}
posted @ 2021-06-13 15:15  acmloser  阅读(25)  评论(0编辑  收藏  举报