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表示你所选择的数的数量。 第2 - S + 1行:每行1个数,对应你所选择的数。
Input示例
8 2 5 6 3 18 7 11 19
Output示例
2 2 6
抽屉原理 (鸽巢原理)
屠龙宝刀点击就送
#include <cstdio> #define Max 55000 long long sum_Mod[Max],sum[Max]; int N,a[Max]; void qr(int &x) { x=0;bool f=1; char ch=getchar(); while(ch>'9'||ch<'0') { f=0; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+(int)ch-48; ch=getchar(); } x=f?x:(~x)+1; } int main() { qr(N); for(int i=1;i<=N;++i) { qr(a[i]); sum[i]=sum[i-1]+a[i]; sum_Mod[i]=sum[i]%N; if(sum_Mod[i]==0) { printf("%d\n",i); for(int j=1;j<=i;j++) printf("%d\n",a[j]); return 0; } } for(int i=1;i<N;i++) { for(int j=i+1;j<=N;j++) { if(sum_Mod[i]==sum_Mod[j]) { printf("%d\n",j-i); for(int k=i+1;k<=j;k++) printf("%d\n",a[k]); return 0; } } } printf("No Solution\n"); return 0; }
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。