THUPC2018看题总结
THUPC2018看题总结
#6387. 「THUPC2018」绿绿与串串 / String
据说是签到题啊。
首先根据题目的意思,我们发现如果能找到那个最后一次选择的对称轴岂不是美滋滋。
自然地,我们先发掘发掘那个对称轴需要具备哪些性质。
发现如果对原串做\(Manacher\)的话,对称轴的回文半径是一定会延长到结尾的。
又发现如果一个位置的回文半径延长到了结尾那么这个字符一定是一个对称轴。
好,现在我们知道所有对称轴了。
但是如果只输出每个对称轴所在的位置的话会少算那种操作多次才能达到目的的\(R\)。
而现在我们只需要验证对于一个前缀,哪些\(R\)经过一顿操作之后能完全等于这个前缀。
而这些所有的\(R\)显然满足大的\(R\)是小的\(R\)的二倍减一因为最终的长度是确定的。
故此我们设\(g[i]\)表示最小的\(R\)能不断反转而完全构成前\(i\)个字符所构成的字符串。
最后暴力输出一下就好了。
#6388. 「THUPC2018」赛艇 / Citing
这题我觉得还挺好的(学长们说是二维\(FFT\),瑟瑟发抖.....
我们发现,如果这鬼东西是一维的那显然好做啊。
就是给定两个\(01\)串,问存不存在一个起点使得把第二个串和第一个串上的起点对齐使得第二个串每个有\(1\)的位置在第一个串上都是\(0\)。
这就那\(FFT\)搞一搞就好了。
详细点就是:
第一个多项式\(A\)中的\(A[i]\)表示第一个串的第\(i+1\)个字符是啥,\(B\)多项式对应第二个。
翻转之后卷一起成了\(C\)就变成了:\(C[i]=\sum\limits_{j=0}^{i-1}A[j]\times B_R[i-1-j]\)。只有两个都是\(1\)的位置\(C[i]\)才不是\(0\)所以扫一遍判一下就好了。
现在考虑二维的怎么办,其实也非常简单就是把下一列首尾相接接到上一列后面就好了。
这样就转化成了第一个问题。
至于第二个串怎么求呢,那就暴力按照它给的方向扫一扫就好了。只有走到的位置是\(1\)其余的是\(0\)。
之后就像上面说的一样\(FFT\),扫一扫就好了嘛。
#6389. 「THUPC2018」好图计数 / Count
我勒个去这个题真的是...绝了......
假设\(n\)个点的好图个数设为\(f_n\)。
设\(f\)构成的普通生成函数是\(F\),就是\(F=\sum\limits f_ix^i\)。
设连通好图个数为\(g_n\)。
我们考虑把这个\(F\)表示表示。
考虑一下把\(n\)分成几个不同的数相加的形式,然后对于每一个都求一下好图个数在除个阶乘什么的发现根本没法做啊。
我们现在给出一个式子:
\[
F(x)=\prod\limits_{k>0}(\sum\limits_{i\ge0}x^{ik})^{g_k}
\]
这是为什么呢?
我们考虑把一个\(i\)个点的连通好图,因为有\(g_i\)种,我们把它们排序。
而\(\sum\)中的\(i\)表示选取了多少个大小为\(k\)的连通好图。
就是:从第一个\(k\)中的第\(k'\)个括号中选取了\(x^{cnt\times k}\),就表示这个好图中包含了\(cnt\)个大小为\(k\)且形状是把\(g_k\)个\(k\)点联通好图排序后的第\(k'\)个。
可能有点拗口....但是还是比较好理解的。
下一步的话,我们发现中间那个\(\sum\)的式子,就是\(\sum\limits_{i\ge 0} x^{ik}\)有点眼熟.....它其实就等于\(\sum\limits_{i\ge 0} (x^k)^i\)。
而这鬼东西我们发现,根据麦克劳林展开的逆变换,把它变回展开之前的模样就是\(\frac{1}{1-x^{k}}\)。
所以原式子变成了
\[
F(x)=\prod\limits_{k>0} \frac{1}{(1-x^k)^{g_k}}
\]
发现这个大\(\prod\)很\(gay\ gay\)啊,完全处理不了的样子嗷....
化简乘积的方法就是取对数把它变成求和再通过一些手段把对数函数删掉。
发现如果取\(ln\)的话刚好可以通过求导删掉所有的对数函数,故此我们对原序列先取\(ln\)再求导。
中间式子就不列了,最后的式子就等于:
\[
F'(x)=F(x)\sum\limits_{k>0} kg_k\frac{x^{k-1}}{1-x^k}
\]
之后我们把每一项拆开看(此处\(ORZ\ cdsszjj\))
\[
[x ^ n]F(x) = (n + 1)f_{n + 1} = \sum\limits_{i = 0} ^ n f _ i ([x ^ {n - i}] \sum\limits _ {k > 0} kg _ k\frac{x ^ {k - 1}}{1 - x ^ k})
\]
然后就变成了
\[
(n+1)f_{n+1} = \sum\limits_{i = 0} ^ n f _ i \sum\limits_{k | n +1 - i}kg _ k
\]
发现和分治\(NTT\)好像啊诶我是不是切了啊哈哈哈哈
等等,\(g\)是啥。
我们不难发现,一个联通好图和一个不连通好图是一一对应的因为如果一个联通好图的补图也是联通好图显然没有办法构造出来啊。
所以\(g_i = f_i / 2\)。
我们先设\(h(n) = \sum \limits_{i|n \& i<n}i\times g_i\)。
那么后面的式子就被我们分成了两部分。
我们把式子分成两部分考虑:
第一部分是\(\sum\limits_{i=0}^nf_if_{n-i}\),第二部分是\(\sum\limits_{i=0}^nf_ih_{n-i}\)。
先说第一部分吧
就是自卷积分治\(NTT\)。
就相当于求\(K_{n+1} = \sum\limits_{i=0}^n K_i\times K_{n-i}\)。
这东西咋做呢,我们假设已经处理出来了\(K_1\)到\(K_{\frac{n}{2}}\)。
那么对于一个\(j\in (\frac{n}{2},n]\),\(K_j\)由两部分组成。
第一部分是两个数都已知,第二部分是两个数,一个已知一个未知(两个未知的数不可能有贡献的因为这样下标和就大于\(n\)了)。
关于第一部分的话,我们就把前半部分自己和自己相乘就好了。
后半部分怎么办呢?
我们发现就是正常的分治\(NTT\)的形式。就是\(f_{n+1} = \sum\limits_{i=0}^n f_i g_{n-i}\)。
后半部分的\(K\)就相当于上述式子中的\(f\),而前半部分的\(K\)就相当于\(g\)因为已经处理好了。
所以只需要对后半部分分治\(NTT\)一下就好了。
总时间复杂度是\(O(nlog^2n)\)。
现在我们看看第二部分怎么办。
为什么我们一定要把上述式子分成两个部分?
因为一个数的约数如果不是自己的话一定不大于自己除以2,这就说明第二部分的所有值都已知。
那么好我们来看一看那个整除关系怎么办啊....
其实也很简单就是枚举前一半区间的每个数,上后一半区间里去找看有没有整除的,这个时间复杂度是调和的。
再算上分治我们总时间复杂度是\(O(nlog^2n)\)。
嗯这题就解决了。
记得到了分治叶子的时候别忘了把\(f_l\)乘上\(l\)。
#6392. 「THUPC2018」密码学第三次小作业 / Rsa
这个题很好啊....
真的是自己想想不到,看了题解觉得自己是傻逼的题.....
就是把第一个式子所有都自乘\(x\)次方,把第二个式子自乘\(y\)次方然后上下乘一起就变成了:
\[
c1^{x}\times c2^{y} \equiv m^{e1\cdot x+e2\cdot y}(mod\ N)
\]
然后对于\(m\)的指数求一下\(exgcd\)就好了.....
就好了....
好了....
了....
#6396. 「THUPC2018」弗雷兹的玩具商店 / Toyshop
第一眼觉得不咋可做。
但是看到了\(m\)非常小,就在线段树上的每个节点开一个长度为\(m\)的数组。
这个数组的第\(i\)个数表示他对应维护区间的代价为\(i\)的权值最大值。
然后暴力维护就好了。
至于查询怎么办呢?
就是对于提取出来的区间先合并到一起,然后对于合并好的数组跑完全背包就好了\(qwq\)。
#6397. 「THUPC2018」蛋糕 / Cake
这个题直接就秒了因为这个才4维。
学长考过一个最多\(10^5\)维的同样问题。
那就非常简单了,打打表就出来了。
#6398. 「THUPC2018」生生不息 / Lives
这个题比较常规。
首先我们发现答案只有\(25\)种情况,极易想到打表。
而且题目中的转移关系是唯一的。
就是一张一个点只有一条出边的有向图。
THUPC2018看题总结的更多相关文章
- UVALive 4953 Wormly--【提醒自己看题要仔细】
有一条虫要过桥,桥有断的木板和好的木板.虫有L条腿B个身体,桥长N.01串表示桥的好坏.输出最少操作次数. 一开始虫的身体在最左B桥上,腿在最左L桥上,最后要到达最右B以及最右L... 操作有2种:① ...
- THUPC2017看题总结
THUPC2017 看题总结 #2402. 「THUPC 2017」天天爱射击 / Shooting 果题. 求当前子弹能会使多少块木板损坏,发现因为木板会随着子弹数目的增加而更加容易损坏,故此询问具 ...
- HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?
这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others) ...
- 欧拉计划(1~3)ps:以后看题一定要认真
那天的题挺简单的 下面来看下 No1 If we list all the natural numbers below 10 that are multiples of 3 or 5, we get ...
- Hibernate 测试分析 好多题都是没认真看题错了。
此题目考查的是对Hibernate中交叉连接的理解.HQL支持SQL风格的交叉连接查询,交叉连接适用于两个类之间没有定义任何关联时.在where字句中,通过属性作为筛选条件,如统计报表数据.使用交叉连 ...
- hdu 1005 1021 递归超限 找规律 // 只要看题中n较大都是有规律的
因为n>1000000000所以用递归 数组超限, 由递归函数f(n)=(A*f(n-1)+B*f(n-2))%7; 因为是除7的余数 因次一共有7*7=49种情况, 以后的值都和之前的对应相等 ...
- 年底了,特贡献一些C#有意思的算法题
2013年,即将要过去了.屌丝C#程序员们拿到了年终奖不?是不是又想蠢蠢欲动了?是不是想通过跳槽来为自己实现加薪的梦想?好吧,跳槽之前还是做点准备吧,准备好C#的笔试吧.这里我收集了些奉献给大家,大家 ...
- 【BZOJ2456】mode 神奇的卡内存题
以后把题解放在前面,估计没人看题解先看题... 内存1M,4个int(其实对内存的概念十分模糊),众数即为出现次数最多的数,可以用抵消的思想(但是众数不是可以是一大坨么...) #include &l ...
- ocp 1Z0-047 131-276题解析
131. Which view would you use to display the column names and DEFAULT valuesfor a table?A. DBA_TABLE ...
随机推荐
- JDBC性能优化篇
系统性能. 少用Metadata方法 与其它的JDBC方法相比, 由ResultSet对象生成的metadata对象的相对来说是很慢的. 应用程序应该缓存从ResultSet返回的metada ...
- react基础语法(四) state学习
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【Conclusion】MySQL的安装和使用
MySQL使用 因为数据库实验用到了MySQL,这里对现在已经涉及到的MySQL部分操作做一个简单的小结. 1.安装MySQL 上MySQL的官网下载对应自己OS平台的MySQL安装文件,有在线安装和 ...
- win10使用自带虚拟机没有Hyper-V场景
开始咯~ 1.打开控制面板-程序和功能-启用或关闭Windows功能 2.发现下面并没有Hyper-v 真难受~~~ 然后百度了一下原来是家庭版的win10没有.那就只能往下面看咯~ 3.在桌面添 ...
- edquota - 编辑用户配额
SYNOPSIS(总览) edquota [ -p proto-username ] [ -u | -g ] username... edquota [ -u | -g ] -t DESCRIPTIO ...
- win10下安装使用mysql-5.7.23-winx64
下载MySQLhttps://dev.mysql.com/downloads/file/?id=478884 解压到文件,此例为D盘根目录 在mysql-5.7.23-winx64目录下创建[my.i ...
- 屏幕卫士模式系统APP开发
利用php的socket编程来直接给接口发送数据来模拟post的操作,(黎灿:I8O..2853..296O 可电可V)线上线下和物流结合在一起,才会产生新零售. 2016年阿里云栖大会上,阿里巴巴马 ...
- JS怎么创建一个类?
15. JS怎么创建一个类? 方式1 : var obj = new Object(); 方式2 : var obj = {}; 16.JS的typeof返回哪些数据类型? string.number ...
- ajax 请求json数据中json对象的构造获取问题
前端的界面中,我想通过ajax来调用写好的json数据,并调用add(data)方法进行解析,请求如下: json数据如下: { “type”:"qqq", "lat&q ...
- 离散数学-集合的交并差集运算--STL-set类
代码其实很简单,我们只需要知道set类的使用方法就可以了,比如迭代器的定义( set<T>::iterator it=a.begin() ),和简单的insert函数插入,以及find函数 ...