zoukankan      html  css  js  c++  java
  • POJ 2356 Find a multiple (鸽巢原理)

    题目大意:给定n个数的集合,从中找出一些数使得他们的和可以被n整除.   离散数学课上老师讲过的竟然忘了= =…… 假定n个数为a1,a2,...,an,前n项和分别是S1、S2、...、Sn,那么如果有一个Si模n是0,就是答案,否则,n个数模n的余数只能在 1到n - 1之间,把余数作为抽屉,显然n个数放到n - 1个抽屉里面,肯定有两个数余数相等,这样取它们的差就得到了结果,算法复杂度是O(n)的。  
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #define MID(x,y) ((x+y)>>1)
    using namespace std;
    typedef long long LL;
    int a[10010], sum[10010], vis[10010];
    int main(){
        int n;
        cin >> n;
        for (int i = 0; i < n; i ++){
            cin >> a[i];
            if (i == 0){
                sum[i] = a[i] % n;
                continue;
            }
            sum[i] = (sum[i-1] + a[i]) % n;
        }
        memset(vis, -1, sizeof(vis));
        for (int i = 0 ; i < n; i ++){
            if (sum[i] == 0){
                cout << i + 1 << endl;
                for (int j = 0; j <= i; j ++)
                    cout << a[j] << endl;
                break;
            }
            else{
                if (vis[sum[i]] != -1){
                    cout << i - vis[sum[i]] << endl;
                    for (int j = vis[sum[i]] + 1; j <= i; j ++)
                        cout << a[j] << endl;
                    break;
                }
                else{
                    vis[sum[i]] = i;
                }
            }
        }
    	return 0;
    }
    
     
    举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG
  • 相关阅读:
    【poj1733】 Parity game
    【poj1018】 Communication System
    【poj1017】 Packets
    【poj1568】 Find the Winning Move
    【poj1085】 Triangle War
    【bzoj1082】 SCOI2005—栅栏
    【codevs1086】 栈
    【bzoj3240】 Noi2013—矩阵游戏
    【bzoj1951】 Sdoi2010—古代猪文
    中国剩余定理学习笔记
  • 原文地址:https://www.cnblogs.com/AbandonZHANG/p/4113996.html
Copyright © 2011-2022 走看看