poj - 2356 Find a multiple

来源:互联网 发布:呼吸淘宝旗舰店真假 编辑:程序博客网 时间:2024/06/14 18:07

http://poj.org/problem?id=2356          

题意:给你n个数,找出几个数,使他们的和是n的倍数;有多少数组成 ,输出哪几个数

题解:鸽巢原理。(1)当前n项和对n取模为0 输出前n个数,即是所求值

  (2)当取模的结果出现两次,那么在这取模相同的(a,b】区间的数即使所求值

code:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;bool vis[15005];int a[10005];int ans[10005];int main(){    int n;    while(cin >> n){        for(int i = 0;i < n;i++)            cin >> a[i];        int t = 0,p = -1;        memset(vis,false,sizeof(vis));        for(int i = 0;i < n;i++)        {            t = (t + a[i]) % n;            ans[i] = t;            if(t == 0) {p = i;break;}            if(vis[t]) {p = i;break;}            if(!vis[t]) vis[t] = true;        }        if(t == 0)        {            cout << p + 1 << endl;            for(int i = 0;i <= p;i++)                cout << a[i] << endl;        }        else        {            int i;            for( i = 0;i <= p;i++)                if(a[i] == t) break;            cout << p - i << endl;            for(int j = i + 1;j <= p;j++)                cout << a[j] << endl;        }    }}


0 0