YOU'VE MADE A BRAVE DECISION, WELCOME.

流离之人追逐幻影。

SDOI2013

为了不留下黑历史,我还是不要作任何主观评价比较好
怎么做得到嘛!

R1D1T1 随机数生成器

BZOJ3122
BSGS+大讨论(不想做)
待补

R1D1T2 森林

BZOJ3123
容易发现如果在一棵树上查询,那就是主席树
这道题只有合并操作,那就好办了,启发式合并
每次Dfs小的那棵树,把小的那棵树合并进大的那棵树的主席树里

R1D1T3 直径

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)这条边后两个联通块的直径就是Ff[u]
考虑如何从u向儿子v转移,也就是说新的FG是什么。
先设一个变量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])

如果上面哪里写错了……那很正常

R1D2T1 方程

BZOJ3129
第二类条件直接在m中减掉a1就好了,这样限制就变成了x>=1
第一类条件很少,可以容斥,强制使得一些限制不满足,转化为第二类限制
然后就是组合数取模了,直接把模数分解成pc,对于每个pc取模,然后CRT合并就好了
怎么取模呢,用阳阳教我的“拓展卢卡斯”(这应该是个口胡的名字)
考虑一个组合数Cnm=n!m!(nm)!,把分母分子中的p都提取出来然后消掉,就可以算逆元了
现在考虑如何把一个阶乘中的p提取出来。
先预处理pc以内不是p倍数的数的前缀乘积Mul[i]
显然x以内p的倍数个数是xp,它们是p,2p,3p,那么可以提取出xp个p,并且这些数变成了1,2,3,于是可以递归
剩下的数不是p的倍数,利用Mul[i]
又发现xpc+x(modpc),于是每pc个数的乘积是相同的,于是快速幂
妈的zz讲不清楚

R1D2T2 费用流

BZOJ3130
显然把所有P的单位费用都放在流量最大的一条边上是最优的
那么二分最大边就好了,注意要实数二分

R1D2T3 淘金

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就好了

R2D1T1 assassin

BZOJ3197
复杂度简直玄妙
一上来先考虑树同构,以重心为根,用波兰哈希法得到每棵子树的hash值
f[u][v]表示第一棵树中u与第二棵树中v配对的最小代价(当然首先uv的hash值相等),现在考虑配对它们的儿子,可以配对的susv之间连费用为f[su][sv]的边,跑费用流
好了没了,估计复杂度O(n7),可能没这么高,但是不会算

R2D1T2 spring

BZOJ3198
设恰好有k个位置相同的组数为Gk
可以用哈希算出至少有k个位置相同的组数Fk=6i=kCikGk
那么答案Gk=6i=k(1)ikCikFi
这个结论是抄题解的,并不会用正常的方法推出来,求大爷教我
网上都没有证明,我就yy了一下:
上式展开成Gk=6i=k(1)ikCik6j=iCjiGk
发现Gj的系数Aj=ji=k(1)ikCikCji
由于CjiCik=CjkCjkik
所以Aj=Cjkji=k(1)ikCjkik=Cjkjki=0(1)iCjki
根据二项式定理,Ak=1,其他A均为0

R2D1T3 escape

BZOJ3199
半平面交然后求一下最短路
待补

R2D2T1 项链

BZOJ3202
山东的同学数学都那么带劲吗

  • Part I:
    首先算出有几种不同的珍珠A
    设有i个的珍珠个数为Ai,下面给出A3的计算方法作为例子:
    A3=ai=1aj=1ak=1ϵ(gcd(i,j,k))=dμ(d)ad3
    那么发现Ai=dμ(d)adi
    考虑一下一个三元组(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[i1][1]×(A1)+f[i1][0]×(A2)
    f[i][1]=f[i1][0]×(A2)
    发现f[i][0]就是长度为i的环的答案
    这个可以用矩阵乘法加速,但是似乎会被卡常数我擦!
    那么我需要一个通项式,但是两个互相关联的函数的通项式我不会求
    那就化一下呗,看f[i][0]会怎么转移:
    f[i][0]f[i+1][1],f[i+1][1]×(A1)f[i+2][0]
    f[i][0]×(A2)f[i+1][0]
    所以设Fi表示长度为i的环的答案的话,Fi=(A2)×Fi1+(A1)×Fi2
    注意如果环长为1的话,除非题目中给出的项链长度为1,否则显然是无论如何都不合法的,所以F1=0
    所以就很好推通项式了

  • Part III:
    灿爷教我学数学
    F的生成函数G(x)=i1Fixi
    (A2)xG(x)=i2(A2)Fi1xi
    (A1)x2G(x)=i3(A1)Fi2xi
    所以
    [1(A2)x(A1)x2]G(x)=F1x+F2x2F1x2=(A2A)x2
    下面第三步用了待定系数法:
    G(x)=x(A2A)x1(A2)x(A1)x2=x(A2A)x[(1A)x+1](x+1)=x(A1(1A)x+1+1Ax+1)=x[(A1)i0(A1)ixi+(1A)i0(1)ixi]=i1[(A1)i+(1A)(1)i1]xi
    由此我们得到Fi=(A1)i+(A1)(1)i

  • Part IV
    知道了F的通项式以后
    Ans=ni=1Fgcd(i,n)=d|nFdndi=1ϵ(gcd(i,n))=d|nFdndi=1d|gcd(i,nd)μ(d)=d|nFdd|ndμ(d)ndd=d|nFdϕ(nd)
    枚举约数算一下就好了

  • Final Part
    整理一下刚才都干了什么
    首先PartI反演算出珍珠颜色个数
    再算出置换的不动点个数之和,利用Fi的通项式和PartIV的反演可以O(nlogn)计算
    最后根据polya定理除以n
    你觉得这就没了吗?
    发现n1014级别,所以可能与Mod不互质
    那怎么办?发现n最多只有一个因子Mod,那么特判一下当Mod|n时,先在模Mod2下算出分子,再把分子除掉Mod再乘上nMod即可,这样答案是不会变的

R2D2T2 保护出题人

BZOJ3203
我该说巧妙呢还是傻逼呢
只要发现y之间独立,且yi=max(ik=jaixi+(ij)×d),j<i,那就好做了
发现上式分子是sumaisumaj1,分母是(xi+id)jd
所以把小于i的每个j看成一个点(sumaj1,jd),询问点(sumai,xi+id)与这些点形成直线的最大斜率即可,这个可以维护一个下凸壳然后三分

R2D2T3 城市规划

BZOJ3204
太神了不会,待补