题面 把\(N\)个无色格子排成一行,选若干个格子染成黑色,要求每个黑色格子之间至少间隔\(M\)个格子,求方案数 思路: 矩阵加速 根据题面,这一题似乎可以用递推 设第\(i\)个格子的编号为\(i\),有\(i\)个格子时的方案数为\(f(i)\) 显然,当 \(i \le M+1\) 时, 可以所有格子不染色(方案数为\(1\)种,或者最多有一个格子染色(方案数为\(i\)种) 所以有\(f(i)=i+1\) 当\(i>M+1\)时, 对于第\(i\)个格子可以由第\(i-1\)个格子转移…
P4714 「数学」约数个数和 题意(假):每个数向自己的约数连边,给出\(n,k(\le 10^{18})\),询问\(n\)的约数形成的图中以\(n\)为起点长为\(k\)的链有多少条(注意每个点都有自环) 这样想是做不出来题的. 正常的题意是:询问\(n\)的约数的约数的....(共\(k\)次复读后)约数个数和. 考虑\(f_k(n)\)表示答案. 显然有\(f_{k}(n)=\sum_{d|n}f_{k-1}(d)\) 注意到用数论卷积的形式可以表示为 \[ \mathtt f_k=\…
「NOI2013」树的计数 这什么神题 考虑对bfs重新编号为1,2,3...n,然后重新搞一下dfs序 设dfs序为\(dfn_i\),dfs序第\(i\)位对应的节点为\(pos_i\) 一个暴力是枚举bfs的分层,然后检查合法性. 但是我们注意到一个事情,节点\(i\)与节点\(i-1\)是否在同一层,是不是具有独立性呢? 设\(s_i\)表示\(i\)与\(i+1\)是否在同一层,当\(s_i=1\)时,表示不在同一层. 那么 \(s_1=1\),显然 若区间\([l,r]\)是同层的,…
「NOI2016」优秀的拆分 这不是个SAM题,只是个LCP题目 95分的Hash很简单,枚举每个点为开头和末尾的AA串个数,然后乘一下之类的. 考虑怎么快速求"每个点为开头和末尾的AA串个数" 考虑枚举A的长度,然后在序列中每|A|个位置放一个关键点,这样每个AA至少都经过了一个关键点. 然后求相邻两个关键点的lcs,lcp,画画图匹配一下,可以把区间内的都求出来了. 可以Hash二分或者sa或者sam Code: #include <cstdio> #include &…
「NOI2016」循环之美 对于小数\(\frac{a}{b}\),如果它在\(k\)进制下被统计,需要满足要求并且不重复. 不重复我们确保这个分数是最简分数即\((a,b)=1\) 满足要求需要满足第一位的余数在后面仍然出现,第一位余数是\(a\bmod b\),后面第\(x\)位的余数实际上是\(a\times k^x\bmod b\) 所以我们需要满足 \[ a\equiv a \times k^x\pmod b \] 有解 因为\((a,b)=1\),所以 \[ k^x\equiv 1\…
「FJOI2018」领导集团问题 题意:给你一颗\(n\)个点的带点权有根树,选择一个点集\(S\),使得点集中所有祖先的点权$\le \(子孙的点权,最大化\)|S|$(出题人语死早...) 一个显然的\(dp\) \(dp_{i,j}\)代表子树\(i\)中选择的点集中最小的点权为\(j\)时的最大值. 一个朴素的转移需要维护一个后缀最大值 设为\(f_{i,j}=\max\limits_{k\ge i} dp_{i,k}\) 一些显然的事实 后缀最大值中仅有最多\(siz_v\)(指子树大…
SP25784 BUBBLESORT - Bubble Sort 题目描述 One of the simplest sorting algorithms, the Bubble Sort, can be expressed as (0-based array): procedure bubbleSort( A : list of sortable items ) n = length(A) repeat swapped = false for i = 1 to n-1 inclusive do…
SP122 STEVE - Voracious Steve 题意翻译 Problem Steve和他的一个朋友在玩游戏,游戏开始前,盒子里有 n个甜甜圈,两个人轮流从盒子里抓甜甜圈,每次至少抓 1个,最多抓m个. 最后一次将当盒子的甜甜圈抓完的人是这一轮游戏胜利者,他可以将所有抓到的甜甜圈吃完,另外一个人是这轮的失败者,他抓到的所有甜甜圈要重新放到盒子里. 下一轮游戏由上一轮的失败者开始抓,游戏继续.直到若干轮后,所有的甜甜圈被吃完,游戏结束. 游戏的目标是吃到尽量多的甜甜圈.游戏最开始,由St…
题面 思路: 作为一个后缀数组的初学者,当然首先想到的是后缀数组 把\(s\)这个串首尾相接,扩展为原来的两倍,就能按后缀数组的方法处理 证明: 神仙一眼就看出这是后缀的裸题,我这个蒟蒻想了半天想不出来 如果我们只对\(s\)串进行后缀排序,明显无法处理如下的情况,于是就拿了30分 \(s=bnabn\) \(bn\)会在\(bnabn\)前面,而实际\(bn\)对应的应该是\(bnbna\),比\(bnabn\)要大 那么应该这么处理这些缺少的串呢? 我们可以尝试一下把原来的\(s\)变成两倍…
题面 长度为\(n\)的数列,现有两种操作: 1.区间异或操作 2.区间求和操作 对于每个查询,输出答案 思路: 线段树+二进制拆位 线段树区间修改一般使用的都是懒标记的方法,但是对于异或,懒标记的方法显然是行不通的,于是就考虑二进制拆位 主要的思路就是将一个数,拆成若干个二进制位,然后对于异或操作,就转换成了每一位上的异或操作 分类讨论一下: 1.当\(x\)的第\(i\)位为\(1\)时,\(1\ xor\ 0=1\),\(1\ xor\ 1=0\) 也就是看成区间取反操作 2.当\(x\)…