- 博客(35)
- 收藏
- 关注
原创 小A的最短路
小A的最短路思路树上问题求两个点的最短距离,显然能用lcalcalca来进行lognlog_nlogn的查询,引入了两个无边权的点,所以我们的路劲就可以规划成三种x−>y,x−>u−>v−>y,x−>v−>u>−yx -> y, x -> u -> v -> y, x -> v -> u >- yx−>y,x−>u−>v−>y,x−>v−>u>−y,只要在这三个当中取一个最小值
2020-07-31 15:14:46 214
原创 欧拉函数的性质及其证明
欧拉函数ppp是素数,则有ϕ(p)=p−1\phi(p) = p - 1ϕ(p)=p−1证明:显然。ppp是素数,n=pkn = p ^ kn=pk,则ϕ(n)=pk−pk−1\phi(n) = p ^ k - p ^ {k - 1}ϕ(n)=pk−pk−1证明:[1,n][1, n][1,n]内,ppp的约数有p,2p,3p,4p……(pk−1−1)pp, 2p, 3p, 4p……(p^{k - 1} - 1)pp,2p,3p,4p……(pk−1−1)p个,所以ϕ(n)=pk−1−(pk
2020-07-29 22:31:16 728
原创 SP5971 LCMSUM - LCM Sum
SP5971 LCMSUM - LCM Sum思路∑i=1nlcm(i,n)\sum_{i = 1}^{n}lcm(i, n)i=1∑nlcm(i,n)=>∑i=1ningcd(i,n)=> \sum_{i = 1}^{n}\frac{i n}{gcd(i, n)}=>i=1∑ngcd(i,n)in=>n∑i=1nigcd(i,n)=> n\sum_{i = 1}^{n}\frac{i}{gcd(i, n)}=>ni=1∑ngcd(i,n)i我们按照
2020-07-29 18:31:50 279
原创 Xor Path
Xor Path思路先是看错题目,以为是所有的路径异或值的和,然后好像用了个假的print函数,一直wa,,,既然是异或,那么当一个点出现的次数是偶数次的时候它会被自己异或成零,也就是队整体的答案没有贡献度,所以我们只要统计有多少条路经过了这个点就行了。我们得到一个节点的每一个儿子的节点数量,然后再剩下不是当前节点中选择一个节点,两个建立一条边,计算得到当前节点的儿子连儿子构成的最短路对这个点的贡献度,然后再加上这个点与其儿子链接的贡献度即可,如果是奇数则异或上我们的答案,否则这个点将会对答案没有贡献
2020-07-29 16:46:02 276
原创 P2303 [SDOI2012] Longge 的问题
P2303 [SDOI2012] Longge 的问题思路我们显然可以枚举每一对数的gcdgcdgcd进行求解,进而我们有如下推导:=>∑i=1ngcd(i,n)=>\sum _{i = 1} ^ {n} gcd(i, n)=>i=1∑ngcd(i,n)=>∑d∣nd∑i=1n(gcd(i,d)==d)=>\sum _{d \mid{n}} d \sum _{i = 1} ^ {n} (gcd(i, d) == d)=>d∣n∑di=1∑n(gcd(i,d)
2020-07-29 16:42:13 301
原创 2019牛客暑期多校训练营(第五场)C generator 2 (BSGS)
2019牛客暑期多校训练营(第五场)C generator 2思路x0=x0x_0 = x_0x0=x0x1=a∗x0∗bx_1 = a * x_0 * bx1=a∗x0∗bx2=a∗x1+b=a2∗x0+a∗b+bx_2 = a * x_1 + b = a ^{2} * x_0 + a * b + bx2=a∗x1+b=a2∗x0+a∗b+b容易发现后项是一个等比数列求和xn=anx0+b(1−an)1−ax_n = a ^ {n} x_0 + \frac {b (1 - a
2020-07-28 11:14:33 286
原创 BSGS及其拓展
BSGS介绍这是一个求解ax≡b(modp)a ^ {x} \equiv b \pmod pax≡b(modp),的方法。并且ppp是质数,a,pa, pa,p互质,费马小定理可知,这个式子有周期性,我们一般取m=sqrt(p)m = sqrt(p)m=sqrt(p),假设x=i∗m+j,0<=i,j<=mx = i * m + j, 0 <= i, j <= mx=i∗m+j,0<=i,j<=m,则有ai∗m+j≡b(modp)a ^ {i * m + j} \
2020-07-27 22:38:40 304 1
原创 中国剩余定理及其拓展
中国剩余定理实质就是解nnn次互质的方程,然后分别乘以他们的取模剩余量,然后相加得到答案,这里就不展开叙述。typedef long long ll;const int N = 1e3 + 10;int a[N], b[N], n;void exgcd(ll a, ll b, ll &x, ll &y) { if(!b) { x = 1; y = 0; return ; } exgcd(b, a % b, x, y); ll temp = x; x = y;
2020-07-27 22:27:07 291 1
原创 [CQOI2007]涂色PAINT
[CQOI2007]涂色PAINT思路显然我们可以考虑用dpdpdp来求解问题,碰到那种一眼没思路的题稳是dpdpdp没跑了,那么我们就往dpdpdp方面去考虑吧。我们定义dp[i][j]dp[i][j]dp[i][j],表示把[i,j][i, j][i,j]这个区间涂上颜色要用多少步,显然有dp[i][j]=1,i==jdp[i][j] = 1, i == jdp[i][j]=1,i==j,接下来我们考虑如何使这个状态进行转移,当有两个邻近的颜色使一样的时候,我们可以把它们当成一种颜色一起涂色,所
2020-07-27 22:09:03 425
原创 2020杭电多校(二) New Equipments(最小费用最大流)
New Equipments思路数据已经有提示了b∗b<=4∗a∗cb * b <= 4 * a * cb∗b<=4∗a∗c,这意味着,每一个a,b,ca, b, ca,b,c构成的二元一次方程只与xxx坐标最多相交一次,所以我们对每一个a∗i∗i+b∗i+c=ya * i * i + b * i + c = ya∗i∗i+b∗i+c=y,在xxx坐标上对应的iii,只有唯一最值,因此我们只要对每一个方程,在它的对称轴两侧选点即可。问题是如何来维护这个最大值呢,显然的每一个方程只能对
2020-07-27 11:12:20 307
原创 各种逆元推导
逆元求解一(费马小定理)ppp是一个质数,并且a%p≠0a \% p \not= 0a%p=0,则有ap−1≡1(modp)a ^ {p - 1} \equiv 1 \pmod pap−1≡1(modp),ap−2≡a−1a ^ {p - 2} \equiv a ^ {-1}ap−2≡a−1,即可得到逆元。int quic_pow(int a, int n, int mod) { int ans = 1; while(n) { if(n & 1) ans
2020-07-26 21:46:33 397 1
原创 B Graph(异或最小生成树)
Graph思路图是联通的,并且加边的时候要保证环一定是异或值为0,所以我们可以保证从一个点到另一个点的路径异或值是不变的,这个时候就简单了,不就是一个异或最小生成树了嘛。我们只要预处理一下,任选一个点作为根节点去得到从这个点到其他点的路径异或值,然后再做一遍异或最小生成树即可。代码/* Author : lifehappy*/#pragma GCC optimize(2)#pragma GCC optimize(3)#include <bits/stdc++.h>#d
2020-07-26 20:17:28 592
原创 G. Xor-MST(异或最小生成树)
G. Xor-MST思路异或最小生成树,这里采用了一种分治的方法来贪心求解最值:首先我们对所有的点权值从小到大排个序,从高位开始在中间找到一个这个位置上的0,10,10,1分界点分成两个集合,然后再通过递归的去求解两个集合。在递归的时候,对两个分开的集合,我们通过trietrietrie树去贪心的在两个集合连上一条边,把这条边加入我们的答案。为什么这样是对的:显然我们分成两个集合我们可以抵消掉高位的一大堆一样的东西,这个时候,我们可以保证我们的贪心策略是正确的。为什么我们要合并两个集合:假设
2020-07-26 19:59:07 994
原创 HDU 4417 Super Mario(莫队 + 树状数组 + 离散化)
Super Mario思路区间查找问题,容易想到离线莫队,确实这题就是莫队,接下来我们考虑如何维护区间高度值问题。既然是离线嘛,我们容易想到离散化和他挂钩,想想这题是否需要离散化,高度的最大值是100000000100000000100000000,但是我们的数据最大值只有100000100000100000,由此我们可以考虑离散化之后用树状数组来维护区间的高度值,再通过树状数组的前缀和查询来得到我们需要的[1,h][1,h][1,h]的答案,由此一个完美的算法(莫队 + 离散化 + 树状数组)就呈现
2020-07-25 09:18:29 255
原创 拓展欧几里德算法模板
ll ex_gcd(ll a, ll b, ll & x, ll & y) { if(!b) { x = 1, y = 0; return a; } ll gcd = ex_gcd(b, a % b, x, y); ll temp = x; x = y; y = temp - a / b * y; return gcd;}int main() { // freopen("in.txt", "
2020-07-24 17:57:37 253
原创 乌龟棋(dp)
乌龟棋思路最优值问题,显然可以通过dpdpdp解决,我们定义dp[i][j][k][l]dp[i][j][k][l]dp[i][j][k][l]表示到达1+i∗2∗j+3∗k+4∗l1 + i * 2 * j + 3 * k + 4 * l1+i∗2∗j+3∗k+4∗l这个点之前已经走过的价值最大的值(i,j,k,li, j, k, li,j,k,l分别是走一步,走两步,走三步,走四步的数量),显然这个点我们可以从dp[i−1][j][k][l]dp[i - 1][j][k][l]dp[i−1][j][
2020-07-24 17:37:49 251
原创 poj 2191 Mersenne Composite Numbers
思路用pollard_rho + miller_rabin来拆分数字,如果得到的质因子大于等于2的话就按照格式输出,否则就不是我们想要的梅森素数。代码/* Author : lifehappy*/// #pragma GCC optimize(2)// #pragma GCC optimize(3)// #include <bits/stdc++.h>#include <iostream>#include <algorithm>#include &
2020-07-24 16:33:45 269
原创 pollard_rho 模板
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a;}ll quick_mult(ll a, ll b, ll mod) { ll ans = 0; while(b) { if(b & 1) ans = (ans + a) % mod; a = (a + a) % mod; b >>= 1; } return ans;}ll quick_po
2020-07-24 16:05:48 327
原创 poj 3233 Matrix Power Series
Matrix Power Series思路题意比较简单,就是要求S(n)=∑i=1nAiS(n) = \sum _{i = 1} ^{n} A^ {i}S(n)=∑i=1nAi,显然有S(n)=S(n−1)∗A+AS(n) = S(n - 1) * A + AS(n)=S(n−1)∗A+A,看到这里,那就简单了,递推式,加矩阵,矩阵快速幂无疑了嘛,所以我们开始构造矩阵。显然有如下矩阵,EEE是单位矩阵,AAA是输入矩阵,OOO是零矩阵。[EEOA]∗[OOAO]\begin{bmatrix} E
2020-07-24 10:38:56 284
原创 小A的柱状图
小A的柱状图思路经典的单调栈题目,对于每一个位置,我们维护他以当前高度可以到达的最左方,以及他当前高度可以到达的最有方,显然就有以他的高度的矩形块的面积就出来了,所以我们只需要统计n个矩形的最大值就行。具体细节操作看代码注释。代码/* Author : lifehappy*/#pragma GCC optimize(2)#pragma GCC optimize(3)#include <bits/stdc++.h>#define mp make_pair#define p
2020-07-23 20:26:58 272
原创 acwing199.余数之和(除法分块)
思路要计算∑i=1nk(modi)\sum _{i = 1} ^ {n}k\pmod {i}∑i=1nk(modi),可化简原式=n∗k−∑i=1nk/i∗i原式 = n * k - \sum _{i = 1} ^ {n} k / i * i原式=n∗k−∑i=1nk/i∗i,显然k/ik / ik/i是一个具有块状性质的区间,我们给定了这个块状区间的lll,就可以得到r=k/(k/l)r = k / (k / l)r=k/(k/l),由此我们开始确定这一长串块状区间的lll,显然有firstl=1.
2020-07-23 10:36:35 302
原创 miller_rabin 模板
miller_rabin 模板ll quick_mult(ll a, ll b, ll mod) { ll ans = 0; while(b) { if(b & 1) ans = (ans + a) % mod; a = (a + a) % mod; b >>= 1; } return ans;}ll quick_pow(ll a, ll n, ll mod) { ll ans = 1;
2020-07-22 18:39:56 342
原创 miller_rabin 证明与实现
143. 质数判定__模板题链接前置知识费马小定理:ppp是质数,则对于任意的aaa,aaa与ppp互质,则有ap−1≡1(modp)a ^ {p - 1} \equiv 1 \pmod {p}ap−1≡1(modp)。二次探测定理:如果ppp是一个质数,x2≡1(modp)x ^ 2 \equiv 1 \pmod px2≡1(modp),则有解为x1=1,x2=p−1x_1 = 1, x_2 = p - 1x1=1,x2=p−1,推理如下⇒x2−1≡0(modp)\Rightarrow x
2020-07-22 18:39:21 470 2
原创 欧拉筛模板
欧拉筛模板const int N = 1e5 + 10;vector<int> prime;bool st[N];void init() { st[0] = st[1] = 1; for(int i = 2; i < N; i++) { for(int j = 0; j < prime.size() && i * prime[j] < N; j++) { st[i * prime[j]] = 1
2020-07-22 18:08:17 298
原创 牛客小白月赛11:Rinne Loves Data Structure
Rinne Loves Data Structure思路我们插入的位置大概分了四种:第一种[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SFLRUFDh-1595317787698)(https://uploadfiles.nowcoder.com/images/20200721/581797790_1595316474417_7BDF5DE0CA110734D601E27F3F965A8E “图片标题”)]显然我们找到比当前插入的值的pre,也就是比当前节点大的最
2020-07-21 15:50:23 344
原创 数列分块入门 (1 ~ 7)
分块6277. 数列分块入门 1分块思想我们把每m个元素分成一块,所以我们总共的块数就是n/mn / mn/m块,一般情况下我们取m=nm = \sqrt{n}m=n.对于区间加操作,我们可以先暴力左右两边,然后对于中间的整块的部分的加减,我们累加在块的标记上,然后我们每次查询的时候只要,每个元素的值加上这个块的标记值,就可以得到我们的答案了。复杂度分析每次操作我们修改的最多的元素最多就是O(n)O(\sqrt {n})O(n)级别的个数,时间复杂读也就是O(n)O(\sqrt n)O(n)
2020-07-20 18:55:20 390
原创 HDU 6071 Lazy Running(同余最短路的应用)
Lazy Running思路还是利用同余的思想,假设存在一条长度为kkk的路,那么也一定存在一条k+basek + basek+base的路base=2∗min(d1,d2)base = 2 * min(d1, d2)base=2∗min(d1,d2)。dis[i][j]=xdis[i][j] = xdis[i][j]=x表示的是,从2−>i2 -> i2−>i点x≡j(modbase)x \equiv j \pmod {base}x≡j(modbase)的满足条件的最小的xxx,所
2020-07-20 10:07:54 278
原创 P2662 牛场围栏(同余最短路)
P2662 牛场围栏思路假设我们已经知道同余最短路是什么了,这里就不再过多赘述。我们要尽可能地得到更多地课建成地边,那么我们必然要选一个basebasebase相对小的,因此我们可以对所有的棍子排个序,然后取a[1]−ma[1] - ma[1]−m作为我们选取的basebasebase。接下来就是考虑建边了,参考这篇博客,我们对所有的可能的边都建立一条与basebasebase同余的边,即for(int i = 1; i < n; i++) for(int j = 0; j <
2020-07-19 17:42:33 407 1
原创 同余最短路(P3403 跳楼机)
同余最短路前置给定m个数,这m个数可以重复取,问最大的这m个数不能拼成的数,或者给定一定范围,范围里有多少个数是这m个数可以拼成的,对于这种问题我们可以考虑同余最短路的算法。P3403 跳楼机同余最短路介绍首先我们要选择一个basebasebase作为基底,之后所有的距离就可以描述成a∗base+ba * base + ba∗base+b。在这题中我们选定xxx作为base。dis[i]=valuedis[i] = valuedis[i]=value有如下含义:value≡i(modx)val
2020-07-19 14:54:25 356
原创 C 简单瞎搞题(牛客练习赛22)(bitset优化dp)
Bitset优化Dp题目链接一般DP做法显然后面的数是与前面的数字相关的,所以我们有dp数组,dp[i][j]dp[i][j]dp[i][j]选取了jjj个数,iii是否可以被创造出来,如果可以其值为1,否则为0。所以我们显然有如下的状态转移方程:n = read(); dp[0][0] = 1;//初始化,一开始dp[0][0]就是是满足条件的。 for(int i = 1; i <= n; i++) { l = read(), r = read(); for(in
2020-07-17 21:50:08 332
原创 线段树平方和板子
题目测试链接代码/* Author : lifehappy*/#pragma GCC optimize(2)#pragma GCC optimize(3)#include <bits/stdc++.h>#define mp make_pair#define pb push_back#define endl '\n'#define mid (l + r >> 1)#define lson rt << 1, l, mid#define rson r
2020-07-17 21:13:26 438
原创 Bitset瞎搞
Bitset字符匹配Regular Number/* Author : lifehappy*/#pragma GCC optimize(2)#pragma GCC optimize(3)#include <bits/stdc++.h>#define mp make_pair#define pb push_back#define endl '\n'using namespace std;typedef long long ll;typedef unsigned lo
2020-07-17 16:08:18 253 1
原创 [SCOI2008]着色方案(DP)
题目链接思想显然我们后面的决策是跟前一步相关的,因此我们可以考虑DP,可以用一个15维的数组来进行转移,但是这样显然回mle,所以我们考虑如何压缩状态,由于1<=Ci<=51 <= C_i <= 51<=Ci<=5,所以我们可以有dp数组:dp[a1][a2][a3][a4][a5][last]dp[a_1][a_2][a_3][a_4][a_5][last]dp[a1][a2][a3][a4][a5][last],a1a_1a1表示可以涂1块木块的有
2020-07-17 13:28:50 265
原创 莫队——三种题型
普通莫队P3901 数列找不同Thinking一定是用可以用莫队来写题,这点是不用质疑的,所以那就简单了,只需要判断每次询问的区间是否满足r−l+1==numr - l + 1 == numr−l+1==num就行了。Coding1Coding_1Coding1莫队写法#include <bits/stdc++.h>#define mp make_pair#define pb push_backusing namespace std;typedef long long
2020-07-09 20:30:08 277
原创 D. Salary Changing(二分,前缀和,贪心,瞎搞)
Salary ChangingThinking这道题第一思路就是二分,模拟了一下样例,感觉好像行于是就开始写。对于二分,我们一定是二分中位数是什么,二分的边界对我们来说是非常重要的,所以我们在二分前有必要确认我们的二分边界,因为一定有∑i=1nli<=s\sum _{i = 1} ^ {n} l_i <= s∑i=1nli<=s,所以我们对lll数组sortsortsort一遍,得到left=lmidleft = l_{mid}left=lmid,同样的,对rrr数组sorts
2020-07-03 17:40:11 302
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人