流离之人追逐幻影。
为了不留下黑历史,我还是不要作任何主观评价比较好
怎么做得到嘛!
R1D1T1 随机数生成器
BZOJ3122
BSGS+大讨论(不想做)
待补
BZOJ3123
容易发现如果在一棵树上查询,那就是主席树
这道题只有合并操作,那就好办了,启发式合并
每次Dfs小的那棵树,把小的那棵树合并进大的那棵树的主席树里
BZOJ3124
第一问两次Dfs;也可以Dp:f[u]表示u的子树中直径,g[u]表示u子树中最深点深度,那么f[u]=max(max(f[v]),max(g[v])+secondmax(g[v])),v表示u的儿子
第二问,如果每条直径都经过一条边,那么去掉这条边后形成了两个联通块,这两个联通块的直径一定会比原树的直径小(下面开始思维混乱,其实说说麻烦自己yy一下还是很简单的)
树形Dp一下,调用Dfs(u,fa,F,G),传入参数F表示除了u的子树以外的联通块中的直径,G表示除了u的子树以外的联通块中的点距离u的最远距离
Dp数组h[u][0..1]表示u儿子们子树中的最深深度的最大值和次大值,l[u][0..1]表示u的儿子们的子树直径的最大值和次大值,这个可以在前面Dp算直径的时候算
那么显然去掉(u,fa)这条边后两个联通块的直径就是F和f[u]
考虑如何从u向儿子v转移,也就是说新的F′、G′是什么。
先设一个变量tmp,如果g[v]==h[u][0]
那么tmp=G+h[u][1],G′=max(G+w(fa,u),h[u][1])
否则tmp=G+h[u][0],G′=max(G+w(fa,u),h[u][0])
如果f[v]==l[u][0],F′=max(F,tmp,l[u][1]),否则F′=max(F,tmp,l[u][0])
如果上面哪里写错了……那很正常
BZOJ3129
第二类条件直接在m中减掉a−1就好了,这样限制就变成了x>=1
第一类条件很少,可以容斥,强制使得一些限制不满足,转化为第二类限制
然后就是组合数取模了,直接把模数分解成∏pc,对于每个pc取模,然后CRT合并就好了
怎么取模呢,用阳阳教我的“拓展卢卡斯”(这应该是个口胡的名字)
考虑一个组合数Cnm=n!m!(n−m)!,把分母分子中的p都提取出来然后消掉,就可以算逆元了
现在考虑如何把一个阶乘中的p提取出来。
先预处理pc以内不是p倍数的数的前缀乘积Mul[i]
显然x以内p的倍数个数是⌊xp⌋,它们是p,2p,3p……,那么可以提取出⌊xp⌋个p,并且这些数变成了1,2,3……,于是可以递归
剩下的数不是p的倍数,利用Mul[i]算
又发现x≡pc+x(modpc),于是每pc个数的乘积是相同的,于是快速幂
妈的zz讲不清楚
BZOJ3130
显然把所有P的单位费用都放在流量最大的一条边上是最优的
那么二分最大边就好了,注意要实数二分
BZOJ3131
显然可以行列分开考虑,如果变化后为x的数有a个,为y的数有b个,那么坐标为(x,y)的数有ab个,要求前k大用堆就好了
问题转化为算出变化后为x的数个数f[x]
这显然可以数位Dp,f[i][j][0..1]表示考虑了前i位当前乘积为j,是/否已经小于N的数个数。但是第二维太过巨大不能枚举
发现j肯定是由2、3、5、7乘起来的,总量应该不会太多,打表发现确实只有1W多个,于是离散第二维Dp就好了
BZOJ3197
复杂度简直玄妙
一上来先考虑树同构,以重心为根,用波兰哈希法得到每棵子树的hash值
f[u][v]表示第一棵树中u与第二棵树中v配对的最小代价(当然首先u、v的hash值相等),现在考虑配对它们的儿子,可以配对的su、sv之间连费用为f[su][sv]的边,跑费用流
好了没了,估计复杂度O(n7),可能没这么高,但是不会算
BZOJ3198
设恰好有k个位置相同的组数为Gk
可以用哈希算出至少有k个位置相同的组数Fk=∑6i=kCikGk
那么答案Gk=6∑i=k(−1)i−kCikFi
这个结论是抄题解的,并不会用正常的方法推出来,求大爷教我
网上都没有证明,我就yy了一下:
上式展开成Gk=6∑i=k(−1)i−kCik6∑j=iCjiGk
发现Gj的系数Aj=∑ji=k(−1)i−kCikCji
由于CjiCik=CjkCj−ki−k
所以Aj=Cjk∑ji=k(−1)i−kCj−ki−k=Cjk∑j−ki=0(−1)iCj−ki
根据二项式定理,Ak=1,其他A均为0
R2D1T3 escape
BZOJ3199
半平面交然后求一下最短路
待补
BZOJ3202
山东的同学数学都那么带劲吗
Part I:
首先算出有几种不同的珍珠A
设有i个的珍珠个数为Ai,下面给出A3的计算方法作为例子:
A3=a∑i=1a∑j=1a∑k=1ϵ(gcd(i,j,k))=∑dμ(d)⌊ad⌋3
那么发现Ai=∑dμ(d)⌊ad⌋i
考虑一下一个三元组(i,j,k)的算重次数,显然A=A3+3A2+2A16
Part II:
现在相当于有A种颜色的珍珠,做等价类计数
然后就可以二话不说先套一发Polya定理,第i种置换是顺时针旋转i个珍珠,有gcd(i,n)个循环。我们先使得每个循环中的珍珠颜色一致。
那么有几种合法的不动点呢?
考虑珍珠1属于第一个循环,珍珠2属于第二个……珍珠gcd(i,n)属于第gcd(i,n)个,珍珠gcd(i,n)+1又属于第一个循环。
所以问题显然可以转换为:把每个循环看成一个珠子,相邻两个不能相同。即现有一个有gcd(i,n)个珠子的环,相邻两个不相同的方案数。
Dp一下试试:
设f[i][0..1]表示长度为i的链,最后一个元是/否和第一个相同的方案数
那么
f[i][0]=f[i−1][1]×(A−1)+f[i−1][0]×(A−2)
f[i][1]=f[i−1][0]×(A−2)
发现f[i][0]就是长度为i的环的答案
这个可以用矩阵乘法加速,但是似乎会被卡常数我擦!
那么我需要一个通项式,但是两个互相关联的函数的通项式我不会求
那就化一下呗,看f[i][0]会怎么转移:
f[i][0]→f[i+1][1],f[i+1][1]×(A−1)→f[i+2][0]
f[i][0]×(A−2)→f[i+1][0]
所以设Fi表示长度为i的环的答案的话,Fi=(A−2)×Fi−1+(A−1)×Fi−2
注意如果环长为1的话,除非题目中给出的项链长度为1,否则显然是无论如何都不合法的,所以F1=0
所以就很好推通项式了
Part III:
灿爷教我学数学
设F的生成函数G(x)=∑i≥1Fixi
(A−2)xG(x)=∑i≥2(A−2)Fi−1xi
(A−1)x2G(x)=∑i≥3(A−1)Fi−2xi
所以
[1−(A−2)x−(A−1)x2]G(x)=F1x+F2x2−F1x2=(A2−A)x2
下面第三步用了待定系数法:
G(x)=x(A2−A)x1−(A−2)x−(A−1)x2=x(A2−A)x[(1−A)x+1](x+1)=x(A−1(1−A)x+1+1−Ax+1)=x[(A−1)∑i≥0(A−1)ixi+(1−A)∑i≥0(−1)ixi]=∑i≥1[(A−1)i+(1−A)(−1)i−1]xi
由此我们得到Fi=(A−1)i+(A−1)(−1)i
Part IV
知道了F的通项式以后
Ans=n∑i=1Fgcd(i,n)=∑d|nFdnd∑i=1ϵ(gcd(i,n))=∑d|nFdnd∑i=1∑d′|gcd(i,nd)μ(d′)=∑d|nFd∑d′|ndμ(d′)ndd′=∑d|nFdϕ(nd)
枚举约数算一下就好了
Final Part
整理一下刚才都干了什么
首先PartI反演算出珍珠颜色个数
再算出置换的不动点个数之和,利用Fi的通项式和PartIV的反演可以O(√nlogn)计算
最后根据polya定理除以n
你觉得这就没了吗?
发现n是1014级别,所以可能与Mod不互质
那怎么办?发现n最多只有一个因子Mod,那么特判一下当Mod|n时,先在模Mod2下算出分子,再把分子除掉Mod再乘上nMod即可,这样答案是不会变的
BZOJ3203
我该说巧妙呢还是傻逼呢
只要发现y之间独立,且yi=max(∑ik=jaixi+(i−j)×d),j<i,那就好做了
发现上式分子是sumai−sumaj−1,分母是(xi+id)−jd
所以把小于i的每个j看成一个点(sumaj−1,jd),询问点(sumai,xi+id)与这些点形成直线的最大斜率即可,这个可以维护一个下凸壳然后三分
R2D2T3 城市规划
BZOJ3204
太神了不会,待补