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;
}