首页 > 其他分享 >鸽巢原理运用

鸽巢原理运用

时间:2023-01-06 17:23:40浏览次数:24  
标签:le int cdots ch 鸽巢 原理 运用 mod define

给定长为 \(m\) 的序列 \(a\),求一组 \(k,l\) 使得 \(m|\sum\limits^l_{i=k}a_i\)。

第一行输入 \(m\);

第二行输入 \(m\) 个数字,表示序列 \(a\)。

输出 \(k,l\)

保证 \(0\le m\le 2*10^5,0\le a_i\le 10^3\)。

保证数据在 \(int\) 范围内。

题解:证明存在性。若 \(a_1,a_1+a_2,a_1+a_2+a_3,\cdots,a_1+a_2+a_3+\cdots+a_m\) 中有任何一个可以被 \(m\) 整除那么结论就成立。设这 \(m\) 个和模 \(m\) 的余数为 \(r1, r2,r3,\cdots,r_m\),因为 \(x \mod m\) 的值只能是 \([0,m-1]\),所以定有两个余数相同,这里用到鸽巢原理。

设这两个相同余数为 \(a_1+a_2+\cdots+a_k=bm+r\) 和 \(a_1+a_2+\cdots+a_l=cm+r\)。我们将其作差得到 \(a_{k+1}+\cdots + a_l=(c-b)m\),故 \(a_{k+1}+\cdots+a_l\) 能被 \(m\) 整除。

那么这就优化了暴力枚举,我们用前缀和判同余即可,时间复杂度达到 \(O(n)\)。

代码:

#include <bits/stdc++.h>
#define rei register int
#define ll long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define rep(i, s, n, c) for (register int i = s; i <= n; i+=c)
#define repd(i, s, n, c) for (register int i = s; i >= n; i-=c)
#define CHECK cout<<"WALKED"<<endl;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0' && ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
#define pb push_back
#define ls id<<1
#define rs id<<1|1
const int INF = INT_MAX;
long long binpow(long long a, long long b, ll mod){long long res = 1;  while (b > 0){if (b & 1) res = res * a % mod;a = a * a % mod;  b >>= 1;  }  return res;}

using namespace std;
int a[200005], b[200005];
int main()
{
	int m = read();
	rep (i, 1, m, 1) {
		a[i] = read();
		a[i] += a[i - 1];
	}
	rep (i, 1, m, 1) {
		int r = a[i] % m;
		if (!b[r]) {
			b[r] = i + 1;
		} else {
			printf("%d %d\n", b[r], i);
			break;
		}
	}
    return 0;
}

标签:le,int,cdots,ch,鸽巢,原理,运用,mod,define
From: https://www.cnblogs.com/CYLSY/p/17031067.html

相关文章

  • Asp.Net Core 中IdentityServer4 授权原理及刷新Token的应用
    一、前言上面分享了IdentityServer4两篇系列文章,核心主题主要是密码授权模式及自定义授权模式,但是仅仅是分享了这两种模式的使用,这篇文章进一步来分享IdentityServer4的......
  • Asp.Net Core EndPoint 终结点路由工作原理解读
    一、背景在本打算写一篇关于Identityserver4的文章时候,却发现自己对EndPoint-终结点路由还不是很了解,故暂时先放弃了IdentityServer4的研究和编写;所以才产生了今天这篇......
  • 栈溢出(一):栈溢出原理以及基本ROP
    栈栈是一种数据结构,遵循后进先出的原则(LastinFirstOut),主要有压栈(push)与出栈(pop)两种操作eax,ebx,ecx,edx,esi,edi,ebp,esp等都是X86汇编语言中CPU上的通用寄......
  • 动态代理原理
    简介java.lang.reflect.Proxy是整个jdk中实现动态代理的核心类,本文主要介绍Proxy类的实现,关于Proxy类的使用请自行查阅其他资料。FieldconstructorParams:构造函数的......
  • Java监听器实现原理
    文章目录​​监听器模型​​​​案例实现​​​​`DeveloperListener`​​​​`Developer`​​​​`Event`​​​​`DeveloperListenerImpl`​​​​测试​​监听器就是监听......
  • 写过vue自定义指令吗,原理是什么?.m
    背景看了一些自定义指令的文章,但是探究其原理的文章却不多见,所以我决定水一篇。如何自定义指令?其实关于这个问题官方文档上已经有了很好的示例的,我们先来温故一下。除......
  • opencv卡尺测量原理
    遍历每个矩形区域,分别找到一个灰度突变的峰值,然后把这N个点剔除问题点拟合直线或圆。可以通过卡尺检测边缘,再用投影法,再求灰度平均值沿着边缘检测方向,垂直扫描图像如图......
  • 230105_05_RPC底层原理
    返回值一定是一个对象,当前是把user拆分成1个id,1个name返回,当user变了,比如增加了属性,则需要再次修改相应代码,因此需要进一步优化直接将这个对象返回,不进行拆分Stub:返回......
  • 日志框架(logback原理分析)
    Java开发中都是默认使用日志门面+日志实现的方式打印日志。日志门面主要是为了给Java日志访问提供一套标准、规范的API框架,其主要意义在于提供接口,具体的实现可以交由......
  • 【深入浅出Sentinel原理及实战】「框架整合专题」Sentinel服务框架对接Dubbo服务框架
    开源框架适配为了减少开发的复杂程度,Sentinel对大部分的主流框架都进行了适配,例如:WebServlet、Dubbo、SpringCloud、gRPC、SpringWebFlux和Reactor等。云原生微服务......