POJ-2356 Find a multiple(鸽巢原理)题目数据太垃圾了!!

来源:互联网 发布:黑暗之魂1萝莉捏脸数据 编辑:程序博客网 时间:2024/05/01 10:52

题意:在给出的N个数字中找出M个数字和为N的整数倍


思路:在离散数学中鸽巢原理大概意思是,有N+1个数字放在N个盒子里必定有一个盒子有2个或者2个以上个数字..

本题如果sum[I] %n==0,那么这组数字就满足条件,如果没有一组数字是满足条件的,那么我们考虑多个数字的组合

如果前i个数字和 与前j个数字和%n相等, 那么 第i+1~j个数字的和必定是n的k倍

先给个AC的,思路正确的代码。

#include <iostream>#include <stdio.h>#include <cstring>#include <algorithm>#include <cmath>int n,m;using namespace std;int a[15001];int sum[15001];int save[10005];int main(){    int n;    cin>>n;    int num=0,ans=0,yes=0,l,r;    for(int i=1; i<=n; i++)    {        cin>>a[i];        if(!yes)        {            sum[i]=(sum[i-1]+a[i]%n)%n;            if(sum[i]==0)            {                l=1;                r=i;                ans=r-l+1;                yes=1;            }            if(save[ sum[i] ] )            {                l=save[sum[i]]+1;                r=i;                yes=1;                ans=r-l+1;            }            save[sum[i]]=i;        }    }    cout<<ans<<endl;    for(int i=l;i<=r;i++)        cout<<a[i]<<endl;}/*21 1*/




心疼自己写的代码。竟然AC了。然而自己造的数据都过不去。亏我想证明自己的思路的正确性。。。抓狂垃圾数据!!!!以后想明白如何正确这个东西错误再删。。。

#include <iostream>#include <stdio.h>#include <cstring>#include <algorithm>#include <cmath>int n,m;using namespace std;int a[15001];int sum[15001];int save[10005];int main(){    int n;    cin>>n;    int num=0,ans=0,yes=0;    for(int i=1; i<=n; i++)    {        cin>>a[i];        if(!yes)        {            if(a[i]%n==0)            {                ans=1;                yes=i;                num=i;            }            sum[i]=(sum[i-1]+a[i])%n;            if( save[ n-a[i]%n ])            {                yes=i;                num=save[n- a[i]%n ];                ans=1+save[n-a[i]%n];            }            save[ sum[i]%n ]=i;        }    }    cout<<ans<<endl;    for(int i=1;i<=num;i++)        cout<<a[i]<<endl;    if(ans!=1)        cout<<a[yes]<<endl;}
52 4 1 1 1


0 0