集训队作业部分自选题

看这个进度,每天只要能做一道自选题应该就能在时限内完成了 = = 所以还是尽量不要看题解好了,看了题解的会标明

119 众数MAX

假设我们枚举众数p,那么显然答案就是$\max_p\{\sum_gmin(ca_g,cb_{p-g})\}$。

考虑分块,对于$ca_g>S,cb_{p-g}>S$的我们暴力,小的fft。

实测取S=4跑的最快。

127 Ball

设$g=\sqrt{x^2+6x+1}$。

简单计(mathe)算(matica)可知$f_n=\frac{2^{-1-n}}{g}(-(1+x-g)^{1+n}+(1+x+g)^{1+n})$。

那么就只缺一个ln、exp、sqrt板子了。测了测只有70,那我也没有办法…

120 Mike学OI(看了)

模板题,见另一篇文章。

130 Cow Coupons

如果买不到k头牛,那么显然是全用优惠券,先sort一下特判一下。

首先先把所有牛按Pi-Ci从小到大排序,那么肯定是有一个分界线,分界线左边找若干个不用优惠券,右边找k个用优惠券。

随着分界线右移,右边的花费会越来越大,从而左边剩下的会越来越小,暴力维护即可。

128 Permutations(看了)

我发现我可能没学清楚laplace展开…

首先显然我们只要算行列式的奇偶性就可以了。

考虑改变一个元素之后行列式的变化,我们把行列式在那一行用laplace展开,类似这样:

image

那么改变的就是这个位子的代数余子式。

那么我们只要求出每个位子的代数余子式,这个很简单,只要求出逆矩阵之后/行列式就是伴随矩阵了。由于行列式是奇数,mod 2之后也不用真的除。伴随矩阵转置一下就是余子矩阵了。01矩阵的逆矩阵直接高斯消元压压位就好。

131 Another Path

显然从1开始的最短路树唯一。为了方便叙述,我们把最短路反过来。

考虑从某个点a到1的another path,如果第一条边是往这个点子树外面走的,那么接下来显然走最短路走到1最优。如果第一条边是往子树里面走的,那么不管在子树里面怎么闲逛,总得走到子树外面,接下来还是走最短路走到1最优,那么最优路径显然还是直接走到那条边的子树里面那端,然后走那条边,然后走最短路到1。

那么我们对于一个点x连出去非树边(x,b),我们考虑x和b的lca,如果可以计入答案,那么就需要满足a是x的祖先,并且a比lca深。贡献就是dist[x]-dist[a]+len(x,b)+dist[b]。

这种东西随便拿个dsu on tree+树状数组维护一下就好了。

134 Counting Divisors (square)

交了发洲阁筛,并不能过。杜教筛常数太大了,可能也不是很能过。我们考虑有没有更加正经的$O(n^{\frac{2}{3}})$做法。

懒得再打一遍了,就截图吧…

image

我觉得这题应该有复杂度更优秀的做法…

108 欧拉子图(看了)

143 海蜇?海蜇!(看了)

123 tree

首先方差可以由和、平方和直接算出,这个相信大家都会。

由于(kx+b)^2=k^2x^2+2kbx+b^2,那么和、平方和都可以在线段树上打标记维护。

我们只要解决树剖这一部分就行了。

首先我们先考虑一下S是啥。

考虑把一条边上面的点叫做上点,下面的点叫做下点。那么S(a,b)就是上点在a到b的路径上的边加上lca(a,b)的父亲边。

那么我们只要考虑如何维护上点在a到b的路径上的边。

考虑把重边和轻边分开维护,先分配所有重边的编号,对于轻边我们把一条重链上作为上点的轻边一起分配编号,这样就行了。

核心代码大致如下:

int top[SZ],b1[SZ],e1[SZ];
void dfs2(int x,int t)
{
    top[x]=t; b1[x]=C+1; if(son[x]) ys[son[x]]=++C,
    rv[C]=son[x],ww[son[x]]=1,dfs2(son[x],t);
    for esb(x,e,b) if(b!=son[x]) dfs2(b,b); e1[x]=C;
}
int b2[SZ],s2[SZ],e2[SZ];
void dfs3(int x)
{
    b2[x]=C+1;
    for esb(x,e,b) if(b!=son[x])
        ys[b]=++C,rv[C]=b;
    s2[x]=C; if(son[x]) dfs3(son[x]);
    for esb(x,e,b)
        if(b!=son[x]) dfs3(b);
    e2[x]=C;
}

139 修墙(看了)

卡了一年常数才过。

135 func

由递推式可以看出f(x+1)为把x分解为2的次幂,每个2的次幂用不超过2次的方案数。

回忆当时的dp:https://github.com/fjzzq2002/project-euler/blob/master/p169.py

n=10**25
f=[1,0]
for i in range(0,500)[::-1]:
    f[(n>>i)&1]=f[0]+f[1]
print f[0]

那么我们现在已知f[0],考虑枚举f[1],倒着进行这个模拟,由于最后一步一定是f[0]=f[0]+f[1],那么f[1]<=f[0]。

枚举之后每一步就是要么f[0]=f[0]+f[1],要么f[1]=f[0]+f[1],大减小即可。

这玩意儿复杂度不大对,那我们可以每次不相减,而是直接取模,复杂度就对了。

114 皇城PK

回忆关于递推式的相关知识:http://l0nl1f3.leanote.com/post/BZOJ4161

那么我们可以发现我们要求的其实就是$(\sum_{i=1}^nx^{d_i})^k~mod~C(x)$,直接大力倍增求就好了。

大力优化了一波常数,还是只有70...先搁着吧,有空的时候补个mtt。

148 Simple Summation Problem(看了)

为啥这题能过一大片啊...大家数论技巧都这么高超的吗...

注意到把原函数卷上$\mu$之后,因为$\mu(x^2)=0$,所以$G(p^d)=F(p^d)-F(p^{d-1})=p^{d-[d~mod~p]}-p^{d-1-[(d-1)~mod~p]}$。当d=1的时候G是0,所以只有每个质因子次数>=2 G才有值。

那么$\sum_{i=1}^nF(i)=\sum_{i=1}^n\sum_{j|i}G(j)=\sum_{i=1}^nG(i)\lfloor\frac{n}{i}\rfloor$,我们只要枚举所有质因子次数>=2的i,直接算就行了。

我们考虑所有质因子次数>=2的i的个数,这就是<=n的powerful number的个数,是O($\sqrt{n}$)的,证明很简单,考虑每个powerful number可以表示成a^2b^3,那么我们枚举a,总共个数肯定不超过$\sqrt{n}+\int_{i=1}^{\sqrt{n}}(n/i^2)^{1/3}=\sqrt{n}+n^{1/3}\int_{i=1}^{\sqrt{n}}i^{-2/3}=O(\sqrt{n})$。

枚举powerful number只要枚举一个无平方因子的b就行。求G只要xjb线筛一下就好了。

125 div(看了)

https://11dimensions.moe/archives/182

zyz写的很清楚了,就不废话了= =

115 replace all(看了)

原来cf的那个题解还是挺清楚的。

虽然n多了几个0,但是没变难啊...

瓶颈在于算$\sum_{i=1}^n\sum_{j=1}^n2^{gcd(i,j)}$。

设F(x)表示$\sum_{i=1}^x\sum_{j=1}^x[gcd(i,j)=1]$,容易发现$F(x)=2\sum_{i=1}^x\varphi(i)-1$。

所以原式等于$\sum_{i=1}^n2^iF(n/i)$,直接对n/i根号分分,把phi拿去杜教筛就行。

129 点点的计算

容易发现T(a,b)=C(a-1,b-1)*a,那我们只要算lcm{C(n,0),C(n,1)...C(n,k)}。

考虑对于每个质数p独立计算,那么答案就是$max_{i=0}^k (\sum_{j=0}^{\infty} \lfloor n/p^j \rfloor -\lfloor i/p^j \rfloor - \lfloor (n-i)/p^j \rfloor)​$,亦即$max_{i=0}^k (\sum_{j=0}^{\infty} [i~mod~p^j  > n~mod~p^j])$。

考虑进行贪心,考虑从小到大第一个$i~mod~p^j > n~mod~p^j$的j,那么只要$p^j$这位比n的$p^j$这位大就行,既然这位已经大了,更往前的位只要相等就行。所以我们可以从低到高考虑每一位,如果可以比n这位大,就比这位大,之后的若干位只要和n相等就行。

枚举每个质数显然太慢了,考虑对于大于$\sqrt{n}$的质数稍微加速一下。对于大于$\sqrt{n}$的质数,只要考虑$i~mod~p>n~mod~p$是否可行,显然取$i=n~mod~p+1$最优,所以只需$n~mod~p \neq p-1$且$n~mod~p+1 \leq k$。先考虑$n~mod~p<k$,这就相当于$n-k<\lfloor n/p \rfloor p​$,我们直接枚举$\lfloor n/p \rfloor$即可。$n~mod~p \neq p-1$即$p|n+1$,枚举n+1的质因子,把满足$n~mod~p+1 \leq k$的扣掉即可。

150 盒中之镜(看了)

把格点黑白染色,把镜子当做边,当且仅当某种颜色的点构成一棵生成树时合法。直接matrix-tree即可。

117 Monkey and Tree

传统的数据结构题,我写的dsu on tree+动态点分治。

144 基础线段树练习

我写的分块+多点求值,跑的还是很快的...

posted @ 2017-11-30 22:40 fjzzq2002 阅读(...) 评论(...) 编辑 收藏