POJ 2356 && POJ 3370 鸽巢原理
2015-01-23 14:52
267 查看
POJ 2356:
题目大意:
给定n个数,希望在这n个数中找到一些数的和是n的倍数,输出任意一种数的序列,找不到则输出0
这里首先要确定这道题的解是必然存在的
利用一个 sum[i]保存前 i 个数的和对n的取模
sum[0] = 0;
那么sum[0] ~ sum
有n+1个数据,这些数据的范围都是 0~n , 要是存在 sum[i] = 0,那么输出前 i 个数据即可
要是不存在那根据鸽巢原理可以说明必然能找到一个 sum[i] = sum[j] ,那么说明 (sum[i+1] + sum[i+2] ...+sum[j])%n = 0的,把这j-i个数输出即可
那么说明我们总是能找到一段连续的数据使其和是n的倍数
POJ3370:
题目大意:
给定n个数,希望在这n个数中找到一些数的和是n的倍数,输出任意一种数的序列,找不到则输出0
这里首先要确定这道题的解是必然存在的
利用一个 sum[i]保存前 i 个数的和对n的取模
sum[0] = 0;
那么sum[0] ~ sum
有n+1个数据,这些数据的范围都是 0~n , 要是存在 sum[i] = 0,那么输出前 i 个数据即可
要是不存在那根据鸽巢原理可以说明必然能找到一个 sum[i] = sum[j] ,那么说明 (sum[i+1] + sum[i+2] ...+sum[j])%n = 0的,把这j-i个数输出即可
那么说明我们总是能找到一段连续的数据使其和是n的倍数
#include <cstdio> #include <cstring> using namespace std; const int N = 10005; bool vis ; int sum , a , pos ; int main() { // freopen("a.in" , "r" , stdin); int n; while(scanf("%d" , &n) != EOF) { for(int i=1 ; i<=n ; i++){ scanf("%d" , a+i); } memset(vis , 0 , sizeof(vis)); vis[0] = 1 , pos[0] = 0; for(int i=1 ; i<=n ; i++){ sum[i] = (sum[i-1]+a[i])%n; if(vis[sum[i]]){ int l = pos[sum[i]]; printf("%d\n" , i-l); for(int j = l+1 ; j<=i ; j++){ printf("%d\n" , a[j]); } break; } pos[sum[i]] = i; vis[sum[i]] = 1; } } return 0; }
POJ3370:
#include <cstdio> #include <cstring> using namespace std; #define N 100005 bool vis ; int sum , a , pos ; int main() { // freopen("a.in" , "r" , stdin); int c , n; while(scanf("%d%d" , &c , &n) , c||n) { for(int i=1 ; i<=n ; i++) scanf("%d" , a+i); memset(vis , 0 ,sizeof(vis)); sum[0] = 0 , vis[0] = 1 , pos[0] = 0; for(int i=1 ; i<=n ; i++){ sum[i] = (sum[i-1] + a[i])%c; if(vis[sum[i]]){ int l = pos[sum[i]]; for(int j=l+1 ; j<=i ; j++){ if(j == l+1) printf("%d" , j); else printf(" %d" , j); } printf("\n"); break; } vis[sum[i]] = 1; pos[sum[i]] = i; } } return 0; }
相关文章推荐
- 鸽巢原理 ..POJ 2356 & 3370
- 鸽巢原理:hdu 1205 吃糖果+poj 2356 Find a multiple+poj 3370 Halloween treats
- POJ 3370 && HDU 1808 Halloween treats(鸽巢原理)
- poj 3370 Halloween treats&&poj 2356 Find a multiple
- poj 3370/2356 鸽巢原理
- 鸽巢原理POJ-3370
- POJ 2356 Find a multiple 鸽巢原理
- POJ 3370 Halloween treats 鸽巢原理
- POJ 2356 Find a multiple (鸽巢原理)
- POJ 2356 Find a multiple / 3370 Halloween treats 鸽巢原理
- POJ 3370 Halloween treats 鸽巢原理 解题
- poj 3370 Halloween treats 解题报告 <鸽巢原理>
- POJ:2356 Find a multiple(鸽巢原理)
- POJ 2356 Find a multiple 鸽巢原理
- 组合数学 poj 2356-鸽巢原理,poj 3270-群-循环,
- POJ 2356 find multiple 鸽巢原理
- 鸽巢原理(入门) 之 poj 2356
- POJ 2356 Find a multiple 鸽巢原理
- poj 3370(鸽巢原理。。。水)
- POJ 2356 鸽巢原理