07 2021 档案

摘要:普通的斯坦纳树是一个NP问题,在多项式时间复杂度范围内无法解决,因此这里的斯坦纳树是很暴力的算法——状压。 显然我们只需要把当前有哪些关键点已经在生成树中记录下来。为了能够转移,我们还必须记录一下当前的根节点是什么。 我们设$f(i,state)$表示根节点为$i$,经过的关键点集合至少为$stat 阅读全文
posted @ 2021-07-26 08:06 lei_yu 阅读(197) 评论(0) 推荐(0)
摘要:n很小,肯定状压之类的题目 显然普通的01不能够确定菌落的状态 利用变进制数即可:$00112$可以表示$12\ 34\ 5$分别为一个菌落,这样刚好存的下。 转移也很简单,但是利用dfs递归会好写很多。当然还是顺推,逆推写不出。 具体实现的时候有很多妙方法优化复杂度,在代码里面可以体现。 变进制数 阅读全文
posted @ 2021-07-25 16:06 lei_yu 阅读(119) 评论(0) 推荐(0)
摘要:很难的一个题目,比较难想。不过是一个动规题应该还是可以想到的。 考虑如果改变一个洗车店的价格,可能会有很多顾客的选择的会改变,环环相扣,后效性难以避免。为了设计出可以转移的方程,我们必须避免后效性。 注意到一个顾客的选择只会因为他所在的区间中的洗车店的价格变化而变化,所以这个题大概应该是一个区间dp 阅读全文
posted @ 2021-07-25 15:14 lei_yu 阅读(62) 评论(0) 推荐(0)
摘要:首先我们可以得到一个很简单的暴力动规 设$f(i,j,k)\(表示当前在\)(i,j)$,经过的时间为k时的最长移动距离。 于是我们可以很朴素的转移。 时间复杂度是$O(nmt)$的 由于$t$太大了,不能直接枚举$t$,但是$k$很小,可以作为$dp$的一维。 对于一个点$(i,j)$,我们对于一 阅读全文
posted @ 2021-07-24 16:40 lei_yu 阅读(49) 评论(0) 推荐(0)
摘要:这个题好像没过,但是我依然要写博客 我们首先考虑暴力做,显然是$O(n3)$的 然后我们找性质 可以发现一个点转移到的其他点一定是在同一斜行上的(/) 这样我们可以优化dp顺序,一斜行一斜行的dp。 然而时间复杂度没有变。 但是我们可以发现在枚举到这一斜行时,这一斜行的值就已经确定了。 显然我们可以 阅读全文
posted @ 2021-07-24 16:25 lei_yu 阅读(34) 评论(0) 推荐(0)
摘要:我们明显可以发现这是一个状压dp 由于两边都很聪明,所以每一次出人肯定会出可以打下别人的。 由此我们可以得到$f(s1,s2,i)$表示甲乙的状态为$s1$,\(s2\),擂主为$i$时甲/乙赢。 这就是一个博弈的题目。 由于双方都非常聪明,在确定擂主的情况下,哪一方出人就确定了,而且剩下的人也是确 阅读全文
posted @ 2021-07-24 16:17 lei_yu 阅读(41) 评论(0) 推荐(0)
摘要:这个题实际上只需要考虑m=1和m=2的情况。 对于$m=1$时,实际上就是一个线性dp,设$f(i,j,0/1)$表示当前dp到第$i$位,已经使用了$j$个矩阵,当前取/不取的分值。 转移很简单。 \(f[i][j][0]=max(f[i-1][j][1],f[i-1][j][0])\) \(f[ 阅读全文
posted @ 2021-07-24 16:03 lei_yu 阅读(58) 评论(0) 推荐(0)
摘要:转换题意 为了表述方便,我们设目标向量为 \((s_1,s_2)\),和题目描述稍有差别。 我们首先只考虑目标向量的横坐标。由于横坐标为 \(a\),\(-a\),\(b\),\(-b\) 的向量均可任意使用,我们可以得到一个不定方程 \(xa+yb=s_1\)。 之后,我们再考虑目标向量的纵坐标, 阅读全文
posted @ 2021-07-18 16:10 lei_yu 阅读(76) 评论(0) 推荐(0)
摘要:首先正常人都可以猜到最小正整数就是所有瓶子容量的gcd 我们先考虑两个瓶子的情况,事实上,设最后的容量是t 那么我们可以 阅读全文
posted @ 2021-07-18 16:09 lei_yu 阅读(32) 评论(0) 推荐(0)
摘要:BSGS本质上是一个分块算法。 我们考虑暴力求解的过程,显然答案的周期为$p$,所以我们只需要求得p之内的答案即可。 此时依然可能有多个解。 这个时候,我们只需要枚举1到p利用快速幂求值即可。 不过这太慢了,我们考虑使用分块的方法 我们把p分为$m=\sqrt p$块 我们求出每一块的端点值即$a^ 阅读全文
posted @ 2021-07-17 11:16 lei_yu 阅读(142) 评论(0) 推荐(0)
摘要:事实上,这是BSGS的模板题 但是我们注意到$a,b,p$并不保证互质。 所以我们首先需要约分 原方程可化为$a^x+py=b$ 等式两边同时除以$g=gcd(a,p)$,得 $a^x/g+py/g=b/g$ 于是有$a^x/g \equiv b/g\ (mod\ p/g)$ 当b不能被g整除时,$ 阅读全文
posted @ 2021-07-17 10:58 lei_yu 阅读(60) 评论(0) 推荐(0)
摘要:注意到这个题不是中国剩余定理。 首先考虑化为中国剩余定理的形式,那么如何才可以消去左边的a呢? 考虑后,我们可以发现如下结论:如果$b$不能被$gcd(a,c)$整除,那么原方程就没有解。因为此时左边一定有一个质因子但右边没有 而如果可以整除,就可以令原式全部除以$gcd(a,c)$,因为$atx+ 阅读全文
posted @ 2021-07-16 21:05 lei_yu 阅读(330) 评论(0) 推荐(0)
摘要:这个题比较离谱的地方是,a和b都和模数不互质。 但是我们很容易发现,\(a,b,p^k\) 有且仅有公因子$p$ 利用这个结论,我们可以记录a和b中包含的$p$的个数单独进行计算,最后合并答案。 如果模数是$px$,$p$是质数,我们可以使用欧拉定理得到逆元即为$a{p^-1}$,当然也可以用exg 阅读全文
posted @ 2021-07-16 20:53 lei_yu 阅读(146) 评论(0) 推荐(0)
摘要:“对呀对呀!……回字有四样写法,你知道么?” ——鲁迅《孔乙己》 逆元有四种求法 1、利用费马小定理 2、利用扩展欧几里得定理 3、求1~n的所有数的逆元,时间复杂度为 \(O(n)\) 具体地,我们首先可以知道$1^{-1}=1$ 于是,对于模数$p$,我们可以设$p=ki+t,t<i$,即$p/ 阅读全文
posted @ 2021-07-16 20:38 lei_yu 阅读(177) 评论(0) 推荐(0)
摘要:逆元和同余方程是差不多的样子 1、exgcd: 同余方程即为求$ax \equiv b (mod\ c)$ 令 $ax=c(-y)+b$,即$ax+cy=b$,然后解这个方程即可。 2、费马小定理:直接求$a^{p-2}$即可 这里注意到一点问题,如果模数是$p^x$,$p$是质数,我们可以使用欧拉 阅读全文
posted @ 2021-07-16 11:02 lei_yu 阅读(195) 评论(1) 推荐(0)
摘要:首先考虑一个问题: 求$ax+by=gcd(a,b)$的通解。 在欧几里得算法的最后一步,我们有$b=0$,$a=gcd(a,b)$。 此时令$x=1,y=0$即为一组解。 在回溯的过程中,我们可以得到$xb+y(a%b)=gcd(a,b)$。 我们要将其转化为$x'a+y'b=gcd(a,b)$的 阅读全文
posted @ 2021-07-16 10:22 lei_yu 阅读(59) 评论(0) 推荐(0)
摘要:待填 阅读全文
posted @ 2021-07-16 10:12 lei_yu 阅读(20) 评论(0) 推荐(0)
摘要:唯一分解定理 1、算数基本定理 对于任何一个大于 1 的整数 a,a 一定能分解为若干个质数的幂的乘积形式,且该分解是唯一的。即 $a=p_1^{r_1}p_2^{r_2}...p_s^{r_s}$ 这是一个很重要的结论。数论的基础。 2、所有正约数的个数为$(1+r_1)(1+r_2)...(1+ 阅读全文
posted @ 2021-07-15 21:53 lei_yu 阅读(196) 评论(0) 推荐(0)
摘要:思路很简单 直接爆搜 用bfs更好得到答案,从最高位往低位搜索。 但是时间会爆掉所以需要优化:对于已经搜到的某个数 $x$ ,如果有 $x \equiv y( mod\ n )$ 那么有 $ax+b \equiv ay+b$ 即下一次搜到同余的数就不用再搜索一次可以直接退出了。比如要凑到13的倍数, 阅读全文
posted @ 2021-07-15 21:28 lei_yu 阅读(144) 评论(0) 推荐(0)
摘要:结论题呢 我们首先考虑数$1080=2^3*3^3*7$ 为了让前一个数能够整除后一个数,即后一个数能够被前一个数整除,我们必须有$x_i=kx_{i+1}$,且$x_i$和$kx_{i+1}$都是数$n$的因数,故$k$也应该是$n$的因数。 但是我们需要让这个序列最长,所以每一次乘的数$k$应该 阅读全文
posted @ 2021-07-15 19:41 lei_yu 阅读(44) 评论(0) 推荐(0)
摘要:主要思想是贪心+搜索 首先我们考虑一个数$n=a_i^{p_i}$ 并且因数的个数为$\prod{(a_i+1)}$ 然后就OK了 对于一个反素数$n=2^a 3^b 5^c ...$,必然有且仅有连续的质因子2,3,5,7...且有$a>=b$ 否则就会有更小的数和它因数个数相同 所以我们可以直接 阅读全文
posted @ 2021-07-15 18:15 lei_yu 阅读(45) 评论(0) 推荐(0)
摘要:算法1: 考虑对ab进行唯一分解($ p_i ^{a_i}$)然后就很好做了,但是分解的过程有点痛苦。。。。 算法2: 考虑$lcm(x,b_0)gcd(x,b_0)=xb_0$ 则$x=b_1gcd(x,b_0)/b_0$ 那么我们只需要枚举$gcd(x,b_0)$的值,就可以算出x,再带入与a的 阅读全文
posted @ 2021-07-15 15:37 lei_yu 阅读(71) 评论(0) 推荐(0)
摘要:首先发现$n-m$是很小的一段 考虑对于一个合数$x$,其必然有一个质因子小于$sqrt(x)$ 所以这个题我们可以先求出$\sqrt{n+m}$内的所有质数,大概最大$10^5$ 然后对于每个质数,使用埃氏筛法的方法筛出$[n,n+m]$的合数即可 欧拉筛应该也可以吧) #include<iost 阅读全文
posted @ 2021-07-15 15:24 lei_yu 阅读(51) 评论(1) 推荐(0)
摘要:水是挺水的 我们首先可以直接预处理出所有H-素数,再预处理出所有的H-半素数,最后求得答案即可。 对于H-素数,使用欧拉筛即可,稍微改一下,只枚举4x+1即可。 对于H-半素数,直接$O(n\sqrt n)$暴力判断即可 时间复杂度$O(n\sqrt n)$ 代码如下 #include<iostre 阅读全文
posted @ 2021-07-15 13:39 lei_yu 阅读(37) 评论(0) 推荐(0)
摘要:朴素算法:对于一个数x,枚举小于 \(\sqrt x\) 的数看他有没有质数即可 因为没有大于$\sqrt x$的因数 筛法1:从2开始,将每个质数的倍数都标记成合数, 筛法2:对于一个数$i$,只用它的最小质因子筛它一次。 对于每一个数,都将它乘以某一个质数$prime[j]$得到一个新的合数$i 阅读全文
posted @ 2021-07-15 10:59 lei_yu 阅读(58) 评论(0) 推荐(0)
摘要:两个知识点 第一个是01分数规划 第二个是树形背包,树形背包请看另一篇博客 01分数规划主要用于求如柿子 $\huge\frac{\sum a_i}{\sum b_i}$的最大值 那么设这个柿子=k,则有 $\sum a_i-k\sum b_i≥0$ 如果说是一个序列,那么我们可以二分k值,直接对所 阅读全文
posted @ 2021-07-13 17:24 lei_yu 阅读(78) 评论(0) 推荐(0)
摘要::again make_data.exe cppa.exe cppb.exe fc a.out b.out if not errorlevel 1 goto again pause 在txt环境下完成后改为.bat文件后把exe放入同一个文件夹即可使用。简单粗暴 阅读全文
posted @ 2021-07-12 21:10 lei_yu 阅读(62) 评论(0) 推荐(0)
摘要:首先考虑结论:u和 v 必须在同一个联通分量里面,然后从 u 沿任意路径走到 v ,设剩下的时间为t,若t 是当前联通分量中所有环的长度的 gcd 的倍数,那么答案是 1 ,否则是 0 。 对于其正确性:若存在满足条件的路径,必定是通过一条链,并路过几个环。由于边正反走的权值互为相反数,那么可以做到 阅读全文
posted @ 2021-07-12 21:06 lei_yu 阅读(173) 评论(0) 推荐(0)
摘要:我们可以发现这个题和树上差分差不多,只是我们在计算前缀和和差分的时候需要改一下更新方式。 用f[u][time] 去更新 f[father][time+1] 然后我们发现一个小问题,这条链的另外一半的时间是倒过来的,于是我们开两个前缀和数组一个存往前更新一个存往后更新就可以了。 那么我们需要注意的是 阅读全文
posted @ 2021-07-12 21:04 lei_yu 阅读(62) 评论(0) 推荐(0)
摘要:很有意思?的一个题目 考虑对于一个最小生成树,它的边权集合S一定是一个确定的集合,不会变化。正确性显然。那么不同的MST只能是 选出的作为最小生成树的一组相同权值的边 不同。 那么我们只需要先把权值更小的最小生成树边先链接起来,再暴力枚举这组边是什么。满足其构成最小生成树的条件即为每一条边都连接了两 阅读全文
posted @ 2021-07-12 21:03 lei_yu 阅读(90) 评论(0) 推荐(0)
摘要:非常有意思的一个题目 首先我们要发现对于一种跳棋的状态,只有三种改变这种状态的方式:对于三元组(X,Y,Z) O O O-- X Y Z X往右边移动:新三元组为(Y,2Y-X,Z) Y往左边移动,新三元组为(2X-Y,X,Z) Y往右边移动,新三元组为(X,2Y-Z,Y) 如果我们设两个相邻棋子之 阅读全文
posted @ 2021-07-12 21:01 lei_yu 阅读(95) 评论(0) 推荐(0)
摘要:图的遍历 太菜了完全不会啊点的染色 EASY 可以发现任意找一个点染成一种颜色就行了。至于方案数可以发现在确定一个点的染色方案下只能有一种染色情况。于是答案为2的连通分量的个数次方。 边的染色 离谱的题目。 欧拉路和欧拉回路 欧拉路需要图联通并有0或2个度数为奇数的点, 欧拉回路则需要图联通并没有度 阅读全文
posted @ 2021-07-12 20:58 lei_yu 阅读(55) 评论(0) 推荐(0)
摘要:最大矩形 考虑每一列矩形找到向左和向右扩展的最长距离。即左边最近哪一个比他小,右边最近哪一个比他小。于是维护一个单调递增的栈即可。这个元素加入栈时的下一个元素便是比他小的第一个,被某个元素弹出时便是这个元素的右边比他小的数被找到了(当前数比要加入的大) 很多面积问题可以用单调栈来解决。 最大01子矩 阅读全文
posted @ 2021-07-12 20:57 lei_yu 阅读(216) 评论(0) 推荐(0)
摘要:用s表示所有木条的总长度,用w表示墙的对边的长度。根据均值不等式,在w∈[0,s]的范围内,面积w(s-w)/2是关于 w 的单峰函数,且最值在 w = s时取得 这个题比较难。 两个极为重要的性质: 不论如何锯木头,矩形总有一条边是原木棍拼成的。 对于总长度为n的一堆木棍,使用一次锯木头的机会的条 阅读全文
posted @ 2021-07-12 20:54 lei_yu 阅读(165) 评论(0) 推荐(0)
摘要:用于优化dp,(时间复杂度花在转移上的),二次差分也可以解决一些问题,分开离线的区间加和以及询问可以通过他们解决。二维前缀和和差分可以解决任意矩形的修改和求和。 二维版本,前缀和求一个矩形方块的面积,差分解决二维区间加和。 等差区间 对于每一次加和,原区间的差分数组是一组相同的数字,对差分数组进行差 阅读全文
posted @ 2021-07-12 20:52 lei_yu 阅读(58) 评论(0) 推荐(0)
摘要:排序 (1)基数排序 从最小的优先级开始排序即可。有些题?可能会用 具体方法是第一遍开一堆桶统计某一关键字的数的数量,确定每个关键字在排序后位置从哪里开始。第二遍扫描直接放入相应位置即可。 (有点鸡肋不过还是可以了解) 基数排序2需要使用离谱到爆的位运算和卡常。 (2)快速排序 Sort 手写:每一 阅读全文
posted @ 2021-07-12 20:51 lei_yu 阅读(45) 评论(0) 推荐(0)
摘要:直接暴力搞树形DP是会爆的,时间复杂度在$O(n^2m)$左右,据说也可以通过某些方法把树形dp优化到$O(nm)$ 这里提供另外一种 离 奇 的方法: 首先考虑一棵树的情况,当某一个节点不选时,我们可以将其直接转移到同根的下一个子树,如果某一个节点选择时,那么就可以将其转移到它的所有儿子。 预处理 阅读全文
posted @ 2021-07-12 20:06 lei_yu 阅读(51) 评论(0) 推荐(0)
摘要:首先一看,我们可以发现a的范围太大,只能写高精度或者取模。 显然,如果我们有 $ f(x) \equiv0 (mod p)$ ,当p为一个大质数时,有很大可能$f(x)=0$,我们可以注意到这也算是一个哈希的思想。 写高精度肯定是会超时的,只有从取模数这个方向考虑。 一、暴力 显然,我们可以得到一种 阅读全文
posted @ 2021-07-12 18:42 lei_yu 阅读(95) 评论(0) 推荐(0)
摘要:淦,异或的性质必须要熟悉啊!!!不看题解就想不到,一看题解就啥都会了) 一个完美的性质:$a\oplus b\oplus b=a$ 于是,对于一个路径$d(x,y)$,必然有$d(x,y)=d(x,root)\oplus d(root,y)$,其中$d(x,y)$表示x到y路径的异或和 接着正解就呼 阅读全文
posted @ 2021-07-12 14:52 lei_yu 阅读(45) 评论(0) 推荐(0)
摘要:那就是最小表示法 最小表示法就是给你的一个可以循环的字符串,找到以某一个字符为开头时字符串的字典序最小。 例如cbad的最小表示法即为adcb 一、暴力 很简单的思想,以每一个字符为开头进行扫描,得到最小表示 具体地,我们可以设置两个指针$i,j$,用$i$表示当前最小表示的开头,$j$作为循环指针 阅读全文
posted @ 2021-07-12 09:18 lei_yu 阅读(69) 评论(0) 推荐(0)
摘要:这个有什么好看的啊,为什么你们都看这个 1.可行性剪枝。在不符合条件时立刻跳出。 (1)在进行组合型搜索时若后面的个数小于要选的个数直接跳了。 (2)金银岛3。在搜索到一个状态时可以考虑后面如果全部最优决策是否满足条件,若已经不满足直接返回。本题即判断全部选最贵的还能不能达到条件。 2.调整搜索顺序 阅读全文
posted @ 2021-07-12 08:45 lei_yu 阅读(227) 评论(0) 推荐(0)
摘要:冲浪 倒序考虑(消除后效性 最后一分钟可以选择的浪花中肯定选最大收益的,以此类推即可。 每分钟加入在当前时间消散的浪花即可。 可用堆优化。 注意开long long 1.最大乘积 通过手推来发现一个贪心策略。 把数字拆的尽量小更好,但是不能够拆出1 多余的拆出的数从最大的往后一个一个加上去。 2.最 阅读全文
posted @ 2021-07-12 08:43 lei_yu 阅读(115) 评论(0) 推荐(0)
摘要:首先依然观察到$N=16$,肯定是状压奶牛。 为了避免后效性,我们发现对于一个奶牛是否能在某个位置只和它前一个奶牛和后一个奶牛有关 因此我们可以设$f(i,state)$表示奶牛状态为$state$(1为在序列中0为不在),当前以后排好队的奶牛的最后一个为$i$的方案数 那么$f(i,state)= 阅读全文
posted @ 2021-07-12 08:26 lei_yu 阅读(31) 评论(0) 推荐(0)
摘要:一个排列可以双映一个数字即可以看做当前排列的的标号,n=3时 123 1 132 2 213 3 231 4 ...... 把一个排列数转化为这个标号比较简单: 其中, 为整数,并且 。表示原数的第i位在当前未出现的元素中是排在第几个。在n比较大的时候,这个数就算不出来了。这个时候我们便储存所有的a 阅读全文
posted @ 2021-07-11 21:36 lei_yu 阅读(61) 评论(0) 推荐(0)
摘要:N=16,首先考虑将其作为状压维度 可以用其来记录哪一些人已经渡河,哪一些人没有渡河。 每一次状态转移就是一次渡河,可以暴力枚举本次渡河的人是哪一些。 利用记忆化搜索可以更好地实现这个过程。 在枚举上一个合法状态的时候可以利用枚举子集的方式来完成,以此降低一部分复杂度。实际上枚举子集的复杂度依然是2 阅读全文
posted @ 2021-07-11 21:11 lei_yu 阅读(124) 评论(0) 推荐(0)