2022.9.23 午间闲话
才发现闲话目录变成 3 upvotes,2 downvotes 了,难道是最近的闲话太水了吗?
如果有建议或意见可以在 留言板 提出哦 QwQ
杂题\(\cdot\)壹
代码可能写得比较难看,轻喷 .
大部分链接都是洛谷的(包括 Remote Judge)= =
时空限制就统一不写了,毕竟这里的题一堆 unusual 的时间限制,漏写了就 GG 了 .
原题提交:
- CF840C On the Bench
- [USACO08JAN] Haybale Guessing G
- SP25338 NPC2015E - Eefun Plays LOL
- SP15086 ACQUIRE - Land Acquisition / [USACO08MAR] Land Acquisition G
- [AHOI2012] 信号塔
(最小圆覆盖,但是没过去) - [ARC075C] Meaningful Mean
一句话题解 / 链接
- 失配树模板:border 树上 LCA
- sum 与 prod:solution .
- [ABC162E] Sum of gcd of Tuples (Hard):平凡欧拉反演,sol .
- P2401 不等数列:欧拉数,直接 \(O(nk)\) 递推 .
- [TJOI2010] 中位数:平衡树板板,当然最经典的做法是对顶堆 .
- * [ZJOI2008] 骑士 / 城市环路:基环树最大独立集
- CF959E Mahmoud and Ehab and the xor-MST:归纳,sol
- CF1665A GCD vs LCM:
普及- 构造题,\(a=c=d=1\),\(b=n-3\) . - * [AGC017D] Game on Tree:树上 Nim 游戏 .
- P5560 [Celeste-B]Golden Feather:完全图 MST,瞎 JB 找规律就完了 .
- P3922 中学数学题:
Python 题solution - CF850D Tournament Construction:兰道定理,link .
- P5160 WD与循环:答案是 \(n+m\choose m\) . 然而要 TM 线性求阶乘逆元要不然会 TLE .
- CF1137D Cooperative Game:Floyd 判圈法(就是俩指针一个走一步一个走两步),sol .
- CF1188D Make Equal:sol .
- P4994 终于结束的起点:Fibonacci 数列 \(\bmod p\) 的循环节 \(\pi(p)\le 6p\),于是可以暴力 .
- CF15C Industrial Nim:结论 .
- P2609 [ZJOI2012]数列:记忆化搜索(?)
乱搞过题(非正解)打 *,题目顺序是随机的 .
* New Product
题目链接 .
多组询问,给定 \(A,B,P\),求最小的 \(x\) 使得 \(A^x\equiv B\pmod P\) .
保证 \(P\) 是素数,询问组数不超过 \(5000\),\(A,B,P\) 不大于 \(50000\) .
BSGS,但是我学 BSGS 的时候就没打出来过 .
于是直接 \(O(P)\) 暴力,根据费马小定理,循环节必然不大于 \(P-1\),于是最小的 \(x\) 必然在区间 \([0,P)\) 内,枚举即可,没有就是无解 .
提交记录 .
由乃与大母神原型和偶像崇拜
维护一个长度为 \(n\) 的序列 \(\{a\}\),支持:
1 x y
:修改 \(x\) 位置的值为 \(y\)2 l r
:查询区间 \([l,r]\) 是否可以重排为值域上连续的一段\(n,m\le 5\times 10^5\) .
类似一个 Hash,维护每个序列的 \(\max\),\(\min\),和,平方和 .
我们知道 \(\max,\min\) 就可以算出和,平方和应该是多少,然后比较即可 .
因为和,平方和会很大所以选一个幸运(素)数对它取模即可 .
提交记录 .
一个几乎一样的题 =.= 算术天才⑨与等差数列 .
Power Tower
区间指数塔给一个序列 \(\{w\}\) 和模数 \(p\),每次询问一个区间 \([l,r]\),求\(w_l^{w_{l+1}^{w_{l+2}^{{...}^{w_r}}}} \bmod p\) .
\(n,q\le 10^5\),\(p\le 10^9\) .
区间询问有点沙雕,直接扩展欧拉定理暴力即可,层数最多 \(\log\) 层 .
于是时间复杂度就是 \(O(q\log p)\) .
因为 \(p\) 达到 \(10^9\) 所以可以 umap 存根号暴力算的欧拉函数 .
当然因为用到的 \(\varphi\) 值都是固定的,所以也可以开一个 vector 存 .
扩展欧拉定理加 \(\varphi(p)\) 情况注意 .
提交记录 .
[六省联考 2017] 相逢是问候
有俩常数 \(c,p\) . 维护一个长度为 \(n\) 的序列 \(\{a\}\),\(m\) 次询问,支持:
0 l r
:区间每个数 \(a_i\) 变成 \(c^{a_i}\) .1 l r
:求 \(\displaystyle \sum_{i=l}^ra_i\),即区间和,答案对 \(p\) 取模\(n,m\le 5\times 10^4\),\(p\le 10^8\) .
根据扩展欧拉定理的 Trick,指数塔层数一高就不做贡献了,于是用势能线段树(好像是这么叫的?)维护就好了 .
线段树需要维护一个数被 \(\varphi\) 几次会没 .
口胡的,没实现 .
珈百璃堕落的开始
一堆算式,每个算式是若干个 \(\sin^2\left(\dfrac{\pi}7\right)\) 和 \(\cos^2\left(\dfrac{\pi}7\right)\) 的和 .
选若干个,使得其和为整数且最大,输出这个最大值 .
(因为题面是这么表示的)下面用 s 表示 \(\sin^2\left(\dfrac{\pi}7\right)\),c 表示 \(\cos^2\left(\dfrac{\pi}7\right)\) .
众所周知 \(\sin^2\alpha+\cos^2\alpha=1\),然而答案要是整数,所以 s 和 c 的数量 \(s', c'\) 必须相等 .
我们以 \(s'-c'\) 作为重量,\(s'\)(或 \(c'\))作为价值,每个算式可以看成物品,做 01 背包即可 .
LocalMaxima
随机一个长度为 \(n\) 的排列,问期望有多少个数比它前面的数都大 ,保留 8 位小数.
\(n\le 2^{31}\) .
期望线性性,拆成每个数比它前面的数都大的概率之和 .
考虑算第 \(i\) 位的概率:
\(x\) 大于排在它前面的所有数的概率,也就是所有比 \(x\) 大的数都在它后面的概率,然后别的随便排 .
所以只需要看比 \(x\) 大的数都在它后面的概率,我们考虑一个排列扔掉所有比 \(x\) 小的数,这样直接排就有 \((n-i+1)!\) 种方案,然而合法方案肯定是 \(i\) 在开头,于是就有 \((n-i)!\) 种合法的 .
直接古典概型大力除,就得到概率是
显然当 \(i\) 取遍 \(1\dots n\) 的数时 \(n-i+1\) 也取遍 \(1\dots n\) 的数,于是答案就是调和级数
这就是老生常谈的东西了,\(n\) 一大就是 \(\ln n\) 了 .
然而这个精度不太够,所以我们加个 \(\gamma \approx 0.5772156649\) 就好了 .
随机数生成器
定义 \(\operatorname{rand}(l,r)\) 返回一个 \([l,r]\) 上的均匀随机正整数,其中 \(l,r\) 都是正整数 .
然后 HKE 写了一个函数
work
(in C++):int work(int x){ if(x==1) return 0; else return work(rand(1,x))+1; }
现在给一个正整数 \(n\),求
work(n)
返回值的期望,保留 5 位小数 .\(n\le 2^{31}\) .
把 work
递归来的返回值看成一个序列 \(\{a\}\) .
然后瞪眼可以看出来
错位相减得
解得
于是这个 \(\{a\}\) 就是调和级数了 .
也就是 \(a_n=H_{n-1}+1\),\(H\) 怎么求上面那个题有说 .
!!! 注意 \(a_1=0\) .
百事世界杯之旅
一个 \(n\) 面的骰子,求期望掷几次能使得每一面都被掷到 .
\(1\le n\le 1000\) .
上来三个调和级数
递推,考虑目前已经集齐了 \(k-1\) 面,那么我们要再整一个得到一个新的的概率肯定是 \(\dfrac{n-k+1}{n}\) .
因为古典概型,于是整一个新面的期望步数就是概率的倒数也就是 \(\dfrac n{n-k+1}\) .
所以答案就是
显然就是 \(nH_n\),\(H\) 是调和级数 .
做完了,然而这题求调和级数的做法有点不同,SP1026 还行,直接暴力就完了,SHOI 那题还得化带分数,毒瘤哇 QwQ .
[NOI Online 2022 入门组] 数学游戏
多组数据,每次给若干个 \(x,z\),求最小的 \(y\) 使得其满足
\[z=xy\gcd(x,y) \]最多 \(5\times 10^5\) 组询问,\(x\le 10^9\),\(z\le 2^{63}\) .
最小 \(y\) 是骗人的,其实 \(y\) 是唯一的 .
先不管无解,假设有解开始推:
因为 \(z=xy\gcd(x,y)\),于是 \(y\gcd(x,y)=\dfrac zx\) .
分解质因数,令 \(\{p\}\) 是递增素数序列,则一个整数 \(t\) 由唯一的无穷序列 \(\{s\}\) 表示,其中
令 \(\dfrac zx, x, y\) 的表示分别是 \(\{a\},\{b\},\{c\}\) . 于是显而易见的有 \(\forall i\ge 1, a_i=c_i+\min\{b_i,c_i\}\) .
因为我们要求的是 \(y\) 所以考虑把 \(\{c\}\) 用 \(\{a\},\{b\}\) 来表示出来 .
那么来讨论这个 \(\min\) 究竟取哪个 .
- 当 \(b_i\le c_i\) 时,有 \(a_i=b_i+c_i\),则 \(c_i=a_i-b_i\) .
此时的限制条件其实对于 \(\{c\}\) 来说是 \(b_i\le \frac 12a_i\),只需要一些简单的代数推导 . - 当 \(b_i< c_i\) 时,有 \(a_i=2c_i\),也就是 \(c_i=\frac 12a_i\) .
类似的,此时的限制是 \(b_i>\frac 12a_i\) .
合并一下,就是 \(c_i=a_i-\min\left\{\dfrac{a_i}{2},b_i\right\}\) .
去分母(如果不去分母会很难做的)得 \(2c_i=2a_i-\min\{a_i,2b_i\}\) .
然后注意到这个序列乘 \(2\) 其实对应原数平方,则
于是就得到 \(y\) 的表达式
如果 \(y\) 代进去发现不是整数就直接判定无解,做完了 .
(\(\gcd\) 里面其实可以再化一下去掉分母的,但是我们的目的肯定是尽可能让数小一点免得爆掉)
听说不用 long double
开根会有精度误差?
星之器
一个 \(n\times m\) 矩阵 \(A\) .
每次可以选两个位于同一行或同一列的不相邻点然后将它们分别向中间移动一位,并产生它们相隔距离的能量 .
给定初始状态和终止状态,问最多产生多少能量 .
\(1\le n,m\le 200\) .
日推天天给我推这道神题,真以为我能做出来吗 qwq
做法真的牛逼啊,首先答案和怎么移动无关,对于一定的初态末态每种移动方式产生的能量都是一样的 .
考虑设一个势能函数使得每移动一次,势能的减少量等于答案的增加量 .
首先整个状态的势能就是每个点的势能之和,且发现势能函数关于维度独立且等价 .
于是令 \(f(x)\) 表示一个维度上第 \(x\) 位的势能,于是根据题目中给的移动方式,就有对于任意两个位置 \(x_1<x_2\),有
移项,得 \(f(x_1+1)-f(x_1)-x_1=f(x_2+1)-f(x_2)-x_2\) .
于是我们的势能函数 \(f\) 只需满足 \(f(x+1)-f(x)-x\) 是定值就完了 .
此时大家就都整的是 \(f(x)=\dfrac{x^2+x}2\),同学们不要拘泥于已有的题解啊,\(f(x)=\dfrac 12x^2+x\) 也行啊 .
于是一个点的势能就是 \(\dfrac 12(x^2+y^2)+x+y\),答案就是初态势能减终态势能 .
实际操作的时候可以把 \(\dfrac 12\) 先提出来,规避浮点数操作 .
Koishi 的数学题
令 \(\displaystyle f(x)=\sum_{i=1}^xx\bmod i\),求 \(f(1),f(2),\cdots,f(n)\) .
\(n\le 10^6\) .
Koishi 好耶!
考虑经典的化法,把 \(f\) 化成整除形式
长得像多点求值似的询问就不是让我们整除分块的,考虑递推 \(\displaystyle g(x)=\sum_{i=1}^ni\left\lfloor\dfrac xi\right\rfloor\) .
可以线性筛,于是问题被 \(O(n)\) 解决 .
当然不筛也行,调和级数过百万也挺棒的不是吗 .
GCD Table
给一个序列 \(\{a_k\}\),问是否存在 \(1\le x\le n,1\le y\le m+1-k\),使得 \(\forall 1\le t\le k, \gcd(x, y+t-1)=a_t\) .
说白了也就是 \(\{a\}\) 在 GCD 表中是否出现过 .
\(n,m,a_i\le 10^{12}\),\(k\le 10^5\) .
qbxt 原题(link T4)加强版,但是做法基本不变 .
仍然是 \(x=\operatorname{lcm}(a_1,a_2,\dots,a_n)\),然后列出同余方程 .
excrt 解出 \(y\),然后回代判定即可 .
结果 CF 一用 __int128
就给我 CE,然后 long long
竟然直接过去了
数字王国的门神
求:
\[\lim_{k\to\infty}\sum_{i=1}^kF_i10^{k-i} \]的第 \(n\) 位到第 \(m\) 位,\(F\) 是 Fibonacci 数列 .
\(10\le m\le n\le 2\times 10^5\),\(0<n-m+1\le 2000\) .
令 \(\displaystyle f(k)=\sum_{i=1}^kF_i10^{k-i}\) .
把 \(10^k\) 整出来就变成:
因为 \(k\to\infty\),于是后面那个 \(\sum\) 就是
发现是形式幂级数形式!众所周知 Fibonacci 数列的 OGF 是 \(\dfrac x{1-x-x^2}\),然后把 \(10^{-1}\) 代进去,这题就做完了 .
然后答案就是 \(\dfrac{10}{89}\) 小数点后第第 \(n\) 位到第 \(m\) 位,有理数就好算多了,直接找循环节就完了,当然这题只有 2e5,暴力也是可以过的 .
Non-equal Neighbours
给一个正整数序列 \(\{a_n\}\),计算有多少个正整数序列 \(\{b_n\}\), 满足:
- \(1\le b_i \le a_i\),\(i\in [1,n]\)
- \(b_i\neq b_{i+1}\),\(i\in [1,n)\)
答案对 \(998244353\) 取模 .
\(n\le 2\times 10^5\),\(a_i\le 10^9\) .
令满足 \(b_i=b_{i+1}\) 的点 \(i\) 为 U 点,则我们就是要算恰有 \(0\) 个 U 点的方案 .
考虑容斥,令 \(f(k)\) 为至少 \(k\) 个 U 点的方案数,则答案为
发现至少有 \(k\) 个 U 点的一组满足条件的 \(\{b\}\) 必然可以被分为 \(n-k\) 个内部全部相等的连续段,因为是至少所以相邻的两段的数不一定要不同 .
令 \(dp_{i,j}\) 为 \(b_{1\dots i}\) 分为 \(j\) 段的方案数,于是答案就是 \((-1)^n(dp_{n,n}-dp_{n,n-1})\) .
枚举 \(i\) 所在的一段的左端点 \(k\),可以得到转移
因为 \(dp_{\dots,j}\) 只和 \(dp_{\dots,j-1}\) 有关,所以可以滚动数组,同时每次 min 的区间总不变小,所以单调栈维护一下即可 .
时空复杂度均为 \(O(n)\) .
CF Submission: 168961015 .
Serval and Rooted Tree
题目链接 .
\(n\) 个节点以 \(1\) 为根的一棵树,每个非叶子节点都有一个操作 max 或 min,表示这个节点中的值应该分别等于其子节点中所有值的最大值或最小值 .
令树上有 \(k\) 个叶节点,你可以将每个叶节点填上 \([1,k]\) 的数字,且每个数字只使用一次,求根节点的最大值 .
\(n\le 3\times 10^5\) .
用一个 DP 状物维护序列 \(\{d\}\),使得对于一个节点 \(u\) ,它的值最大可以为以 \(u\) 为根的子树中叶子节点的数值中排名第 \(d_u\) 大的数值(就是贪心).
于是对于每个 \(d_u\),有转移:
- 若 \(u\) 是叶子,则 \(d_u=1\) .
- 若 \(u\) 是 min 节点,则 \(\displaystyle d_u=\sum_{v\in\operatorname{son}(u)}d_v\) .
- 若 \(u\) 是 max 节点,则 \(\displaystyle d_u=\min_{v\in\operatorname{son}(u)}\{d_v\}\) .
于是答案就是 \(k+1-d_1\),时间复杂度 \(O(n)\) .
以上是意识流内容 .
提交记录 .
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16617719.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ