Link
Solution
考虑的一个约数会对答案产生多大的贡献,即有多少 稍加分析就知道是个。 从枚举到,如果是约数就地计算和。
这样不会T。。从到的约数个数和是,所以的约数个数就是,取值不会很大的。。
求靠谱一些的靠谱性证明。。。
Code
1 | //Code by Lucida |
考虑N的一个约数d会对答案产生多大的贡献,即有多少i≤N,gcd(i,N)==d 稍加分析就知道是ϕ(dN)个。 i从1枚举到√N,如果是约数就O(√N)地计算ϕ(i)和ϕ(iN)。
这样不会T。。从1到N的约数个数和是∑[iN],所以N的约数个数就是∑[iN]−∑[iN−1],取值不会很大的。。
求靠谱一些的靠谱性证明。。。
1 | //Code by Lucida |
结论很神。。但知道结论了也没推出来。。
i=1∑Nd(i)=i=1∑N[iN](AHOI2005约数探究) 这个是把每个数对答案的贡献的累计得出的结论。 继续这个思路,有可能猜到
i=1∑Nj=1∑Md(ij)=i=1∑Nj=1∑M[iN][jM]也就是按照统计对答案的贡献这个思路,只不过多用个乘法原理。 然后再完善一下就是最后的结论
i=1∑Nj=1∑Md(ij)=i=1∑Nj=1∑M[iN][jM][gcd(i,j)==1](说的好像真的能做出来似的)
然后开始反演
第三个式子的i,j枚举的是倍数。。
f(n)=n∣d∑μ(nd)F(d)Ans=f(1)=d∑μ(d)i=1∑[dN]j=1∑[dM][idN][jdM]下一步!! 注意到右边的那个东西是两个关于[dN]和[dM]的函数!!于是把它们提取出来处理一个前缀和就可以加速了!
所以,要分块加速,不一定要把相应项的分母换成同一个,还可以根据求和指标等等方面判断是否能化成一个函数的两个取值。
1 | //Code by Lucida |
多条直径相交的形态一定是
类似树网的核,求出直径之后,从直径的一端开始走。记一个点p到直径左、右端点的距离为dlp,drp,设当前走到的边的左右两点分别为pl,pr,如果从pl不走直径的边能走出一条长度为drpl的路径,或者pr能走出dlpr那这个边就不是直径的公共边。
走到第一条公共边开始累加答案,到第一条非公共边break,就可以解出来了。
树的直径的性质分析用到了很多反证法。有些结论正向思考无法下手,不妨试试能不能把自己举出的反例否掉,以尝试得出反证的思路。
1 | //Code by Lucida |
最小割+最小割可行边判断+退流
被坑。
论Dinic与ISAP的效率。
学网络流算法的时候听说ISAP更高效,就直接没看Dinic。做的几道网络流题也全都没有因为算法被卡过。
但是,今天被卡飞了。
ISAP写完,TLE。本地测试,最大的一个点需要4s。卡常数,最大的一个点还是3s。于是各种办法都没用。
发现网上过掉的程序几乎都是Dinic。学了Dinic。写出来调对之后很快就通过了。
以下纯属一个蒟蒻的自言自语
d[S]<N || num[x]==0。这是ISAP的终止条件。当对网络流进行局部调整的时候,如果两个点之间不联通,可能尝试绕出很多条增广路,才会判定出它们不联通。
加上计数器,计算一次ISAP不联通时的迭代次数,发现单次ISAP,1400个点的图最多居然出现了15W次无效的循环才结束。
而Dinic就每次O(n)一遍BFS就保证了在不联通时就能及时结束。
So,整体一遍的用ISAP,对图进行局部调整的用Dinic。
欢迎拍砖 欢迎吐槽
1 | //Code by Lucida |
1 | //Code by Lucida |
求
i<=N∑j<=M∑lcm(i,j)改成枚举d=gcd(i,j)
Ans=d∑i<=N∑j<=M∑dij[gcd(i,j)==d]=d∑i<=N∑j<=M∑dij[gcd([di],[dj])==1]令x=[di],y=[dj],则
Ans=d∑x<=[dN]∑j<=[dM]∑xyd[gcd(x,y)==1]=d∑d{x<=[dN]∑j<=[dM]∑xy[gcd(x,y)==1]}好了,现在的问题是:求
i<=a∑j<=b∑ij[gcd(i,j)==1]定义F(n)=∑i<=a∑j<=bij[n∣gcd(i,j)],f(n)=∑i<=a∑j<=bij[gcd(i,j)==n],则
F(n)=n∣d∑f(d)f(n)=n∣d∑μ(nd)F(d)要求的是
f(1)=d∑μ(d)F(d)考虑求F(n),
好了,
好了,
Ans=p∑p{x<=[pN]∑j<=[pM]∑xy[gcd(x,y)==1]}令T=pd,则
为什么我想推O(n)的却直接推出了O(√n)的
不过好歹算是自己推出来了,,虽然用了半个小时。。主要是变量重名把自己绕晕了,就重新推。。推反演式子的时候多用几个字母。。重名晕了就GG了。。
前面分块,后面前缀和。。
而后面的前缀和是一个积性函数。
一个数论函数f,如果在gcd(x,y)==1的时候有f(xy)==f(x)f(y),则称为积性函数。
有了第二个结论之后,h(T)=T∑d∣Tμ(d)d就是个积性函数了。因为μ是个积性函数,而id也是个积性函数(id(n)=n)。
积性函数就可以用线性筛筛了
1
2
3
4
5
6
7
8...
if(!notp[i]) prime[++pcnt]=i;
for(int j=1;j<=pcnt && prime[j]*i<=N;j++)
{
notp[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
...
如果,说明h(i×primej)==h(i)h(primej) 否则,对于这个函数,i×primej比i多出来的因数一定都是primej2×x的形式,它们的μ都是0,所以不会对答案产生贡献。所以对答案的影响只是前面的系数i变成了i×primej,即h(i×primej)=i×primej∑d∣iμ(d)d
1 | //Code by Lucida |
1 | //Code by Lucida |
想到了b=0是BSGS,然后化式子,结果化错了,以为不会,就弃疗了。。
化出式子, 同乘a−1,BSGS,真好哈。 然后写,写完WA。本地测90。 想不透。研究数据无果。事实证明我太naive。 这个xi每次都要,怎么能把分母带着呢?? 于是把a−11换成inv(a−1),重新划划式子,改上,WA。 无奈,又查了查,发现BSGS写错了。mid=√P,应该取上整,这样imid−j才能取遍[0,P]。之前写BSGS从没出过这种问题,说明还算是比较隐蔽的。。要好好记着。
思考题还是要慢点,不要急躁。 用高中数学方法化出来的式子不一定能直接套到模型里,尤其是很可能不适用于在同余系。
1 | //Code by Lucida |
良心出题人。。写一个LCT再写一个裸主席树再写一个暴力就给85pts。。
正解启发式。启发式真是好,好写又不慢。。
如果没有Link操作,直接树上主席树(见CLJ论文)。
对于Link操作,采用把小树合到大树里面去的方法。小树所有节点的主席树都暴力重建。
查询的时候要求LCA。因为是动态地连接,只能用倍增(可以不用吗??)。因此在之前的DFS中搜到每个点都预处理一下fa[][]数组。
对于一个点,重建一次的代价是O(logn)(主席树+倍增)。一个点至多被重构O(logn)次:因为每次重构,这个点所在的子树的大小都至少扩大了一倍,所以最多logn次操作就能这个点与其它所有的点连成一棵树了。类似并查集的按秩合并。
一开始WA了,然后RE了。因为fa[][]数组没有彻底清零,写成了
1
if(!(fa[pos][i]=fa[fa[pos][i-1]][i-1])) break;
倍增LCA数组重建之后一定要彻底清零。。
1 | //Code by Lucida |
找出一条从1到n,max(ai)+max(bi)最小的道路 两个量不好一起算, 可以通过枚举ai,求出相应最小的bi来做。 用LCT维护,边转点,在点上记录边的bi。 按照ai排个序,然后依次枚举边e,设,为起点,终点 如果和不联通,那就连上 否则如果到的道路上bi最大值大于当前的be,就切掉 否则就continue 然后如果没有continue的话,把这个边连上,更新答案。
很早就做过,复习拿出来看看打算写写新的下传标记的方法。 于是就惨了 在里是只有需要下传,但在LCT里,按照那个原则,在和都要下传。也就是说只要的父子关系要变动,之前就必须要。于是就很愉快地debug了大半上午。
1 | //Code by Lucida |
这种算法都是玄学
每次先random_shuffle来随机改变序列(好像并不能增加随机性?不管了反正本来就是玄学)
每次random地改动一个元素所在的集合,如果更优直接改掉;
否则,有一定的概率改掉,直观地想下,这个概率应该需要逐渐减小的(否则不就等于每次都无视之前所做的努力吗。。),由此就引入了温度的概念。
从初始温度开始模拟退火,每次循环的温度降低一些,接受不优解的概率是TT0,通过随机数来实现。
1 | //Code by Lucida |
学习了
复习了
做的题
总结
这20天做的题目还是有一半以上不能独立做出来,相比之下码力的提高却是很大的。
以后做题还是要多总结,多思考,培养分析问题的能力,补齐自己的短板。
始终要牢记我的目标,不要被盲目地刷Ranklist,让我做的每一道题都有意义、有价值。

从现在到过年的这几天 精做NOI的题目