poj2356:Find a multiple

简介: 题目链接: 【鸽巢原理+乱搞】 其实用不着开map 一步最巧妙的转化是前缀和。 反正本宝宝突发奇想就出来了。 首先,我们分类讨论。 1.当iN+i[1,n] 使 ai|n 则直接选这个数就好 2.没有以上那种特殊情况的话,我们记录前缀和sumi=ik=1ak(mod  n) 然后又有两种情况。

题目链接:

【鸽巢原理+乱搞】

其实用不着开map

一步最巧妙的转化是前缀和。

反正本宝宝突发奇想就出来了。

首先,我们分类讨论。

1.当iN+i[1,n] 使 ai|n 则直接选这个数就好

2.没有以上那种特殊情况的话,我们记录前缀和sumi=ik=1ak(mod  n) 然后又有两种情况。

根据鸽巢抽屉原理,因为我们现在在(mod  n)剩余系下,有n个数。所以只会有两种情况: 

  (1).当这n个数互不相等的时候,一定 iN+i[1,n] 使 sumi0  (mod n)

     则直接选1n 就好。

  (2).如果有两个sum相等,假设为sumi,sumj ,j>i,则sumjsumi0  (mod n)

    而sumjsumi=jk=iak 所以就可以选这 ji 个数了。

一开始WA掉3次因为集合大小输出错了2333……qwq

 上代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
int n;
int a[100100];
int sum[100010];
signed main()
{
    scanf("%dll",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]),sum[i]=(sum[i-1]+a[i])%n;
        if(a[i]%n==0) {printf("1\n%lld",a[i]);return 0;}
        if(sum[i]==0) {printf("%lld\n",i);for(int j=1;j<=i;j++) printf("%lld\n",a[j]);return 0;}
    }
    for(int i=1;i<=n;i++)
      for(int j=i+1;j<=n;j++)
        if(sum[i]==sum[j])
        {
            printf("%lld\n",j-i);
            for(int k=i+1;k<=j;k++)
              printf("%lld\n",a[k]);
            return 0;
        }
    return 0;
}

 

目录
打赏
0
0
0
0
6
分享
相关文章
Term Suggester 中 suggest_mode 的三种模式missing、popular、always 的区别
Term Suggester 中 suggest_mode 的三种模式missing、popular、always 的区别
LeetCode 116. Populating Next Right Pointers
给定一颗二叉树,填充每一个节点的next指针使其指向右侧节点。 如果没有下一个右侧节点,则下一个指针应设置为NULL。
96 0
LeetCode 116. Populating Next Right Pointers
Kuroni and Impossible Calculation——容斥原理-鸽笼原理-抽屉原理
题目描述 已知一个数组a[n],请计算式子:∏_{1≤i<j≤n}|ai−aj| 的值,其中1<=i,j<=n;我们可以认为,这一式子等价于 |a1−a2|⋅|a1−a3|⋅ … ⋅|a1−an|⋅|a2−a3|⋅|a2−a4|⋅ … ⋅|a2−an|⋅ … ⋅|an−1−an|
144 0
Kuroni and Impossible Calculation——容斥原理-鸽笼原理-抽屉原理
HDOJ(HDU) 2139 Calculate the formula(水题,又一个用JavaAC不了的题目)
HDOJ(HDU) 2139 Calculate the formula(水题,又一个用JavaAC不了的题目)
112 0
HDOJ 1019 Least Common Multiple(最小公倍数问题)
HDOJ 1019 Least Common Multiple(最小公倍数问题)
109 0
HDOJ 2028 Lowest Common Multiple Plus(n个数的最小公倍数)
HDOJ 2028 Lowest Common Multiple Plus(n个数的最小公倍数)
146 0
C-POJ-1426 Find The Multiple
Description Given a positive integer n, write a program to find out a nonzero multiple m o...
981 0
<select multiple="multiple"> 数据回显
var names = yunying_name.split(","); for (var i = 0; i < names.length; i++) { names[i] = names[i].
1559 0
下一篇
oss创建bucket
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等