zoukankan      html  css  js  c++  java
  • poj2356 Find a multiple(抽屉原理|鸽巢原理)

    /*
    引用过来的
    题意:
        给出N个数,问其中是否存在M个数使其满足M个数的和是N的倍数,如果有多组解,
        随意输出一组即可。若不存在,输出 0。
    题解:
        首先必须声明的一点是本题是一定是有解的。原理根据抽屉原理:
        因为有n个数,对n个数取余,如果余数中没有出现0,根据鸽巢原理,一定有两个数的余数相同,
    如果余数出现0,自然就是n的倍数。也就是说,n个数中一定存在一些数的和是n的倍数。
    本题的思路是从第一个数开始一次求得前 i(i <= N)项的和关于N的余数sum,并依次记录相应余数的存在状态,
    如果sum == 0;则从第一项到第i项的和即满足题意。如果求得的 sum 在前边已经出现过,假设在第j(j<i)项出现
    过相同的 sum 值,则从第 j+1 项到第i项的和一定满足题意。
    */
    #include<stdio.h>
    #include<string.h>
    #define MAX 16000
    int s[MAX],sum[MAX],has[MAX];
    int main(void)
    {
        int n,i,j;
        while(scanf("%d",&n)!=EOF)
        {
            int l,r;
            memset(has,-1,sizeof(has));
            memset(sum,0,sizeof(sum));
            has[0]=0;
            for(i=1;i<=n;i++)
                scanf("%d",&s[i]);
            for(i=1;i<=n;i++){
                sum[i]=(sum[i-1]+s[i])%n;
                if(has[sum[i]]==-1) has[sum[i]]=i;
                else{
                    l=has[sum[i]];
                    r=i;
                }
            }
            printf("%d
    ",r-l);
            for(i=l+1;i<=r;i++){
                printf("%d
    ",s[i]);
            }
        }
        return 0;
    }
  • 相关阅读:
    文件搜索和图像裁剪
    Mat的复制
    map
    substr
    cin,scanf
    strstr
    Applying vector median filter on RGB image based on matlab
    sobel算子的一些细节
    matlab 有趣小细节
    高斯混合模型(GMM)
  • 原文地址:https://www.cnblogs.com/woshijishu3/p/3866659.html
Copyright © 2011-2022 走看看