51nod 1103 N的倍数 (抽屉原理)

题目链接:传送门

题意: 略。

分析:

把前缀和统计出来对n取模,任意连个相等的sum[i],sum[j],[i,j]内的数的和都满足这个条件。

n个数对n取模,范围为[0~n-1],由抽屉原理可知,最少有一个数模n=0,或者两个数模n相等。

代码如下:

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

const int maxn = 50010;

LL a[maxn],sum[maxn];

int main()
{
    int n;
    while(~scanf("%d",&n)){
        int tag = 0;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            sum[i] = i == 0 ? a[i]%n : (sum[i-1] + a[i])%n;
            if(sum[i]==0) tag = i;
        }
        if(tag){
            printf("%d\n",tag+1);
            for(int i=0;i<=tag;i++)
                printf("%d\n",a[i]);
            continue;
        }
        int st=0,ed=0;
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(sum[i]==sum[j]){
                    st=i+1,ed=j;
                    tag=j-i;
                    break;
                }
            }
            if(tag) break;
        }
        if(tag==0) puts("No Solution");
        else{
            printf("%d\n",tag);
            for(int i=st;i<=ed;i++)
                printf("%d\n",a[i]);
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-24 18:37:02

51nod 1103 N的倍数 (抽屉原理)的相关文章

51NOD 1103 N的倍数(抽屉原理)

传送门 一个长度为N的数组A,从A中选出若干个数,使得这些数的和是N的倍数. 例如:N = 8,数组A包括:2 5 6 3 18 7 11 19,可以选2 6,因为2 + 6 = 8,是8的倍数. Input 第1行:1个数N,N为数组的长度,同时也是要求的倍数.(2 <= N <= 50000) 第2 - N + 1行:数组A的元素.(0 < A[i] <= 10^9) Output 如果没有符合条件的组合,输出No Solution. 第1行:1个数S表示你所选择的数的数量.

1103 N的倍数 (抽屉原理)

题意:一个长度为N的数组A,从A中选出若干个数,使得这些数的和是N的倍数. 例如:N = 8,数组A包括:2 5 6 3 18 7 11 19,可以选2 6,因为2 + 6 = 8,是8的倍数.(2 <= N <= 50000,0 < A[i] <= 10^9) 分析:在modN意义下求A的前缀和,若有为0的前缀和,前k个即为所求;若没有,有抽屉原理,必然存在两个值相等的前缀和,两者相减即为所求. 1 #include<iostream> 2 #include<c

51nod 1103 N的倍数

1103 N的倍数 题目来源: Ural 1302 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 一个长度为N的数组A,从A中选出若干个数,使得这些数的和是N的倍数. 例如:N = 8,数组A包括:2 5 6 3 18 7 11 19,可以选2 6,因为2 + 6 = 8,是8的倍数. Input 第1行:1个数N,N为数组的长度,同时也是要求的倍数.(2 <= N <= 50000) 第2 - N + 1行:数组A的元素.(0 < 

51nod 1103 N的倍数 思路:抽屉原理+前缀和

题目: 这是一道很神奇的题目,做法非常巧妙.巧妙在题目要求n个数字,而且正好要求和为n的倍数. 思路:用sum[i]表示前i个数字的和%n.得到sum[ 1-N ]共N个数字. N个数字对N取模,每个数字都在0-( N-1 )之间. 可能出现两种情况  1:有一个数字等于0.(都不相等)   2:至少有两个数字相等. 1.如果sum数组中有一个数字sum[i]=0,说明前i个数字的和为N的倍数. 2.如果sum[i]==sum[j],说明第i-( j-1 )或者( i+1 )-j的和为N的倍数.

鸽巢原理(抽屉原理)的详解

抽屉原理 百科名片 桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面放两个苹果.这一现象就是我们所说的“抽屉原理”. 抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1或多于n+1个元素放到n个集合中去,其中必定至少有一个集合里有两个元素.” 抽屉原理有时也被称为鸽巢原理(“如果有五个鸽子笼,养鸽人养了6只鸽子,那么当鸽子飞回笼中后,至少有一个笼子中装有2只鸽子”).它是组合数学中一个重要的原理. 第一抽屉原理 原

AC日记——N的倍数 51nod 1103

1103 N的倍数 思路: 先计算出前缀和: 然后都%n: 因为有n个数,所以如果没有sum[i]%n==0的化,一定有两个取模后的sum相等: 输出两个sum中间的数就好: 来,上代码: #include <cstdio> using namespace std; #define maxn 50005 int n,ai[maxn],sum[maxn],ioss[maxn]; inline void in(int &now) { register char Cget=getchar()

1103 N的倍数

1103 N的倍数 题目来源: Ural 1302 基准时间限制:1 秒 空间限制:131072 KB 一个长度为N的数组A,从A中选出若干个数,使得这些数的和是N的倍数. 例如:N = 8,数组A包括:2 5 6 3 18 7 11 19,可以选2 6,因为2 + 6 = 8,是8的倍数. Input 第1行:1个数N,N为数组的长度,同时也是要求的倍数.(2 <= N <= 50000) 第2 - N + 1行:数组A的元素.(0 < A[i] <= 10^9) Output

POJ 3370 Halloween treats(抽屉原理)

Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6631   Accepted: 2448   Special Judge Description Every year there is the same problem at Halloween: Each neighbour is only willing to give a certain total number of sweets

poj2356 Find a multiple(抽屉原理|鸽巢原理)

/* 引用过来的 题意: 给出N个数,问其中是否存在M个数使其满足M个数的和是N的倍数,如果有多组解, 随意输出一组即可.若不存在,输出 0. 题解: 首先必须声明的一点是本题是一定是有解的.原理根据抽屉原理: 因为有n个数,对n个数取余,如果余数中没有出现0,根据鸽巢原理,一定有两个数的余数相同, 如果余数出现0,自然就是n的倍数.也就是说,n个数中一定存在一些数的和是n的倍数. 本题的思路是从第一个数开始一次求得前 i(i <= N)项的和关于N的余数sum,并依次记录相应余数的存在状态,