zoukankan      html  css  js  c++  java
  • 51nod1103(抽屉原理)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1103

    题意:中文题诶~

    思路:抽屉原理

    对于两个数a, b, 若a=b(modx),那么(a-b)%x=0;

    所以求满足题意的数列,我们可以在连续子序列里面找到.

    证明:我们用num[i]存储a[i]的前缀和mod n的值,我们有n个前缀和,其mod n的值有1~n-1 n-1种可能(如果为0的话说明第1个元素到第i个元素的和是n的倍数啦),由抽屉原理可知,必定至少有两个值是相同的,也就是说我们可以从连续子序列中找到满足题意的数列;

    那么我们只要标记num[i]在之前是否出现过就好了啦。。。

    代码:

     1 #include <iostream>
     2 #define MAXN 50010
     3 #define ll long long
     4 using namespace std;
     5 
     6 int a[MAXN], vis[MAXN];
     7 ll num[MAXN];
     8 
     9 int main(void){
    10     ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    11     int n;
    12     bool flag=true;
    13     cin >> n;
    14     for(int i=1; i<=n; i++){
    15         cin >> a[i];
    16         num[i]=(num[i-1]+a[i])%n;
    17     }
    18     for(int i=1; i<=n; i++){
    19         if(!num[i]){
    20             cout << i << endl;
    21             for(int j=1; j<=i; j++){
    22                 cout << a[j] << endl;
    23             }
    24             return 0;
    25         }else if(vis[num[i]]){
    26             cout << i-vis[num[i]] << endl;
    27             for(int j=vis[num[i]]+1; j<=i; j++){
    28                 cout << a[j] << endl;
    29             }
    30             return 0;
    31         }else{
    32             vis[num[i]]=i;
    33         }
    34     }
    35     return 0;
    36 }
  • 相关阅读:
    第一章epoll
    sk_buff结构--转载
    邻居子系统1.5 neigh output
    netfilter内核态与用户态 通信 之 sockopt
    邻居子系统1.4
    邻居子系统 1.3
    邻居子系统 1.2
    邻居子系统 1.1
    linux 内核 tasklets 原理以及工作队列
    linux 内核 同步原理
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/6346904.html
Copyright © 2011-2022 走看看