摘要:
输入 A , B, C, k 设 D = 2^k 则存在 ( x, y ) 使 A + C*x = B ( mod D ) => A + C*x = B + D*y => C*x - D*y = B - A 令 a = C, b = D, c = B-A 则转换成线性同余方程 : a * x + b * y = c 使用扩展欧基里德求解即可解题代码View Code #include<stdio.h>typedef long long LL;LL ExGcd( LL a, LL b, LL &x, LL &y ){ if( b == 0 ){ x... 阅读全文
摘要:
给定同余方程组 X = r1 ( mod a1 ) X = r2 ( mod a2 ) ... X = rn ( mod an )求解正整数X, 若不存在输出 -1关于 线性同余方程组求解, 看笔者前一篇博客关于求解方式,模板裸题#include<stdio.h>typedef long long LL;LL ExGcd( LL a, LL b, LL &x, LL &y ){ if( b == 0 ) { x=1;y=0; return a; } LL r = ExGcd( b, a%b, x, y ); LL t = x; x = y; y = t - a/b. 阅读全文
摘要:
前言:关于区间最值问题的求解,我们一般采用线段树来维护区间最值,得到了O(NlogN)的算法。但对于区间第k值问题,我们应该如何解决呢?本文将介绍一种基于线段树思想衍生出来的新结构——划分树,来解决这个问题。1 划分树 其实,划分树和线段树的区别并不大,可以归纳为两点: 1.1 划分树每一个区间[L,R]维护的是一个一维数组[L..R]。 1.2 划分树每一个根结点[L,R]中前[(R-L+1)/2]小的点组成左子树,后[(R-L+1)/2]大的点组成右子树。2 划分树求区间k值 我们首先修改一下思考方式,原问题变成在已经sorted的数列中找出第k个在区间[s,t]中的数字。 先给... 阅读全文
摘要:
维基百科介绍:http://en.wikipedia.org/wiki/Kdtree KD树是一种能在 O(N)时间内把平面划分成若干个区域,然后在均摊 O(logN)的时间内找到某个区域内所有点的数据结构。其思想是,每次把当前处理的区域按照点数分成两部分,然后对两部分进行递归处理。。。分成两部分有两种策略: 一种是横着竖着横着竖着交替划分。。 一种是把坐标跨度大的那一维划分成两部分。似乎没什么影响。上图是一种可行的划分方式。每次找到当前处理点集中的中点,以这个中点为分界线把区间划分成两部分和。注意中点是作为分界线不参与下一轮处理。查询一个点的最近点时,首先令最近距离为,然后在KD树中查... 阅读全文