CH 4302 Interval GCD 题解】的更多相关文章

题意 给定一个长度为N的数列A,以及M条指令 (N≤5* 10^5, M<=10^5),每条指令可能是以下两种之一: "C l r d",表示把 A[l],A[l+1],-,A[r] 都加上 d. "Q l r",表示询问 A[l],A[l+1],-,A[r] 的最大公约数(GCD). 由<九章算术>中的更相减损我们知道gcd(x,y)=gcd(x,y-x)同理可以推到多个整数.(可以用数学归纳法证明) 因此,构造一个长度为N的新数列B,其中B[i…
辗转相减法的扩展 $gcd(x, y, z) = gcd(x, y - x, z - y)$ 当有n个数时也成立 所以构造$a_{i}$的差分数组$b_{i} = a_{i} - a_{i - 1}$,用一个线段树来维护b数组的gcd,这样每次区间修改相当于两次单点修改 考虑到询问的时候$ans = gcd(a_{l}, query(l +1, r))$所以我们再维护原数组a的值,直接差分之后用一个树状数组就好了 注意判断边界情况. Code: #include <cstdio> #inclu…
题意 4302 Interval GCD 0x40「数据结构进阶」例题 描述 给定一个长度为N的数列A,以及M条指令 (N≤5*10^5, M<=10^5),每条指令可能是以下两种之一: "C l r d",表示把 A[l],A[l+1],-,A[r] 都加上 d. "Q l r",表示询问 A[l],A[l+1],-,A[r] 的最大公约数(GCD). 输入格式 第一行两个整数N,M,第二行N个整数Ai,接下来M行每条指令的格式如题目描述所示. 输出格式 对…
等差数列 为了检验学生的掌握情况,jyy布置了一道习题:给定一个长度为N(1≤N≤100,000)的数列,初始时第i个数为vi(vi是整数,−100,000≤vi≤100,000),学生们要按照jyy的给出的操作步骤来改变数列中的某些项的值.操作步骤的具体形式为:A s t a b (s,t,a,b均为整数,1≤s≤t≤N,−100,000≤a,b≤100,000),它表示,在序列的[s,t]区间上加上初值为a,步长为b的等差数列.即vi变为vi+a+b×(i−s)(对于s≤i≤t). 在焦头烂…
描述 给定一张N个点的有向图,点i到点j有一条长度为 i/(gcd(i,j))的边.有Q个询问,每个询问包含两个数x和y,求x到y的最短距离. 输入格式 第一行包含两个用空格隔开的整数,N和Q. 接下来Q行,每行两个数x和y. 输出格式 输出Q行整数,表示从x到y的最短距离. 样例输入 6 2 4 6 2 5 样例输出 2 2 数据范围与约定 对于30%的数据,1<=N<=100. 对于70%的数据,1<=N<=10^5. 对于100%的数据,1<=N<=10^7,1&…
原题链接 庆祝一下:数论紫题达成成就! 第一道数论紫题.写个题解庆祝一下吧. 简要题意:求 \[\sum_{i=1}^n \sum_{j=1}^n [gcd(i,j)==p] \] 其中 \(p\) 为素数. 注: $ [A] = 0 $ 当且仅当 \(A\) 不成立. $ [A] = 1 $ 当且仅当 \(A\) 成立. 这不就是单位函数的定义嘛. 先抛个定义: \[f_n = \sum_{i=1}^n [\gcd(i,n) == 1] \] 即 \(\leq n\) 且 与 \(n\) 互质…
题目大意:给定一个长度为 N 的序列,M 个操作,支持区间加,区间查询最大公约数. 题解: 先来看一个子问题,若是单点修改,区间最大公约数,则可以发现,每次修改最多改变 \(O(logn)\) 个答案,且 gcd 可以合并,因此可以直接在线段树上维护. 但是对于区间加来说,无法在已知区间加了某一个数时快速计算出新的区间最大公约数,因此,最坏情况下复杂度可能退化到 \(O(n)\).考虑辗转相除法的性质,\[gcd(x,y,z)=gcd(x,y-x,z-y)\]可以发现,若维护的是原序列的差分序列…
题目:hdu的5726 (我原博客的东西,正好整理过来,属于st表裸题) (可以看出我当时有多么的菜--) 这道题写了一遍,然而蒟蒻的我的时间爆炸了-- 于是看了一下学长的代码(顺便在此处%一下学长). 不明觉厉了两个小时 终于看明白了 由于这道题是基于st表写的(这部分比较基础) 我就直接讲第二问(就是查相等GCD个数) 那么为了不用每一个区间挨个比较一遍的话,我们所能想到的速度较快的方法-- 对!二分. 但是如果把二分的方法想象成类似于查询数的方法那是不可以的(因为数字是无序的,很容易造成G…
https://vjudge.net/problem/CodeChef-DGCD https://www.codechef.com/problems/DGCD 题目大意: 给一颗带点权的树,两个操作: 1.将两点间最短路上的点权+d 2.查询两点间最短路上的点权的GCD 显然又是树链剖分,点这里看树链剖分原理. 但是我们发现一个问题,我们虽然可以建立线段树维护GCD,但是没有办法处理区间修改问题. 我们考虑更相减损之术的原理,两数做差后的结果和小数的GCD=原来的GCD. 所以我们在维护单点权值…
整理题目转化为数学语言 题目要我们求: \[\sum_{i=1}^n\sum_{i=1}^m[gcd(i,j)=p]\] 其中 \[p\in\text{质数集合}\] 这样表示显然不是很好,所以我们需要更加数学一点: \[\sum_{k=1}^{n}\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=k]\ \ \ \ \ (k\in\text{素数集合})\] 按照套路我们转化为: \[\sum_{k=1}^{n}\sum_{i=1}^{\lfloor\frac{n}{k}\r…