51nod进阶计划 20/20

目标

又要来51nod滑水啦
主要是来做点数学题
看看做完20题以后可以到哪里吧
现在16题,才3480分。。感觉好少啊。。
希望这20题可以贡献多一点吧。。

由于数学居多,所以会非常劣质

题表

1675 序列变换

很棒的一个题啊,用的是这一个
这里写图片描述
我们先求出 F ( i ) ,表示左右gcd是i的倍数的和,然后再用上面这个形式变回去就可以了

1179 最大的最大公约数

很水的一个题啊。。
就暴力分解下因数,然后如果有一个因数出现次数超过2,那么就合法,从大到小扫一下就可以了

1188 最大公约数之和 V2

一开始想反演。。然后T了

A n s > g = 1 n g i = 1 n / g j = 1 n / g ( i , j ) = 1 > > i = 1 n n / i n / i d | i d μ ( u / i )

后面那个其实就是欧拉函数。。
于是就得到了一个 O ( n ) 预处理,然后 O ( n ) 询问的做法
但是这样并不可以 A ,因为你会 T
于是我们要换一个做法, 比较懒,不想写公式了
于是就得到了一个预处理 O ( n l o g n ) ,然后询问 O ( 1 ) 的做法
这里写图片描述

1239 欧拉函数之和

杜教筛的一个入门题啊!
我们知道

d | n ϕ ( d ) = n

ϕ ( n ) = n d | n d < n ϕ ( d )

A n s = i = 1 n ( i d | i d < i ϕ ( d ) )

把i提出来可以得到
A n s = n ( n + 1 ) 2 i = 1 n d | i d < i ϕ ( d )

那么我们只需要后面那个值就可以了
因考虑枚举后面 d / i 的值,可以得到
A n s = n ( n + 1 ) 2 i = 2 n d = 1 n i ϕ ( d )

后面递归求解即可

1244 莫比乌斯函数之和

也是一个杜教筛入门题啊
我们知道

d | n μ ( d ) = [ n = 1 ]

于是
1 = i = 1 n d | i μ ( d )

还是一样的套路,枚举 i / d
可以得到
1 = i = 1 n d = 1 n i m u ( d )

于是后面递归去求解就好了
得到式子
A n s = 1 i = 2 n M ( n i )

1190 最小公倍数之和 V2

刚写完一次,然后崩溃了,文章没了,不想详细写了
感觉是bzoj2226的加强版啊
考虑到有了下界,如果用补集就有了上界,于是之前那题其中 F ( n ) 为一个数n小于等于他且和他互质的和 ,这个方法不好用了
于是考虑换一个方法
公式太多,给个吧。。
但是其实在对拍的时候发现,余数个数是可以达到很大的,至少比500大。。
好像有1000的吧。于是我的数组一改再改,改到了10000才没有崩溃。。所以实在想卡,应该也卡得了。。但是数据随机啊,所以整体还是很快的。。
然后不知道为什么,我的代码很慢。。用了循环展开才成功卡过

1407 与与与与

还不错的一个题啊
开始想想想,想了半天才想回容斥,感觉要完
然后我们现在就需要知道 f [ i ] ,表示某些位是1的数有多少个
想了很多不靠谱的方法,比如说暴力bitset合并,这样是 10 6 n / 32 ,显然过不去。还有枚举子集DP,这样是 3 20 也过不去
于是我们考虑要使用一个更快的方法
直接求肯定是不行的,于是我们一位一位来
f [ k ] [ i ] 表示前k位,&i=i,且后面的与i一样的有多少个
这样递推式就很显然了
如果 i 的第 k 位是 1 ,则 f [ k ] [ i ] = f [ k 1 ] [ i ]
否则, f [ k ] [ i ] = f [ k 1 ] [ i ] + f [ k 1 ] [ i + 2 k ]
然后就可以 n l o g n 预处理了,然后再容斥一下就可以了。。
注意k要滚动,要不会MLE

1537 分解

很简单的一个题,但是居然没有做出来,怕是被题目这个形式给吓到了QAQ,下次见到这种题目一定不能慌啊,要好好想想
我们设 ( 1 + 2 ) n = a + b 2
那么明显地, ( 1 + 2 ) n + 1 = ( a + b 2 ) ( 1 + 2 ) = ( a + 2 b ) + ( a + b ) 2
显然地,A,B是可以矩乘的
然后我们考虑怎么求出m
可以得到式子 ( 1 2 ) n = a b 2
上下相乘,得到 ( 1 ) n = a 2 2 b 2
当n是偶数的时候
1 = a 2 2 b 2
1 + 2 b 2 = a 2
m = a 2 时, m 1 = 2 b 2
恰好满足题意
然后当n为偶数的时候同理,然后这题就做完了

1237 最大公约数之和 V3

非常简单的一个反演题啊!!!还有640分,真是赚死了。。
由于式子太简单,就不写了,两部就推完了,就是一个欧拉
分块,然后强行上杜教筛就可以了
听说杜教筛由于又记忆化,所以时间复杂度是加上去的?
不管了,反正跑得特别快

2026 Gcd and Lcm

容易发现,f是一个积性函数
乱搞一下就发现,其实是问你f(i)的前缀和,然后平方一下
考虑这个怎么杜教筛

i = 1 n d | i μ ( d ) d = i = 1 n d = 1 n i μ ( d ) d

问题就转化成了求
g ( x ) = d = 1 n μ ( d ) d
的前缀和
因为
i = 1 n i d | i μ ( d ) = 1

其实中间有一步为什么考虑这个没有写,大家意会一下就好了,我不想打了
常用套路
i = 1 n i d | i μ ( d ) = i = 1 n i d = 1 n i d μ ( d )

然后就可以杜教筛了
感觉这题收获蛮大的啊,感觉学会了杜教筛的正确姿势
以前记忆化都是用map存的,这样会很慢。。
其实考虑到,如果n是一样的,我们只需要存 n / x 即可,因为你每一次进去询问,都是类似于 n / x 的形式,这样子空间也开的下,查询也是 O ( 1 ) 的了

1594 Gcd and Phi

直接构造函数 F ( i ) 表示 g c d 是i的倍数有多少个数对
显然,这个可以用个数的平方弄出来
然后莫比乌斯还原回去就可以了。。
裸题

1192 Gcd表中的质数

上次做过一次了,就是bzoj的2280,但是这次居然没什么思路QAQ
主要是被限制在每一次枚举质数了。。没有动手推别的式子,真是失败。。
于是认真地写一次把

A n s = p = 1 ( p ) m i n ( n , m ) d = 1 m i n ( n , m ) μ ( d ) n d p m d p

然后我居然就卡在这里了QAQ
d = d p
d = 1 m i n ( n , m ) n d m d p | d μ ( p )

然后后面部分的前缀和可以 n l o g n 预处理,然后就可以根号询问了

1223 分数等式的数量

很棒的一个题啊!!看起来毫无思路,挣扎了一下就看题解了。。
题意明显的,就是问题

x = 1 n y = i + 1 n x + y | x y

然后这个形式看起来无从下手,我们可以尝试着提取它的gcd
d = g c d ( x , y ) x = d i , y = d j
问题变成了求
d i + d j | d i d j
,即
i + j | d i j

又因为 i j 互质,所以
i + j i j
,因此,若想满足条件,即需满足
i + j | d

m = ( n )
那么
A n s = i = 2 m j = 1 i n i ( i + j ) ( i , j ) = 1

直接求这个似乎并不好求
于是我们考虑反演一波, F ( i ) 表示,gcd是i的倍数的答案有什么,这样就好求了
F ( d ) = i = 1 n d j = 1 i n i ( i + j ) d 2

这个是可以很快算出来的。。
然后有了这个,用反演公式,即可以把 g c d = 1 的给还原回去
然后我的代码巨慢。。跑 10 11 本机要4s左右,卡了循环展开还是很慢。。于是买了最后一个数据,发现就是 10 11 ,于是打了这个点,
不要骂我就好了

1220 约数之和

3994: [SDOI2015]约数个数和十分像的一个题吧。。其实就是进化版
是自己推出来的,还居然一次打对,感觉很开心啊
在这里纪念一下吧

A n s = i = 1 n j = 1 n a | i b | j a j b d | ( a , b ) μ ( d ) = a = 1 n b = 1 n d | ( a , b ) μ ( d ) a | i b | j a j b

你可以发现,其实后面就是一个常数乘上一个等差数列
A n s = a = 1 n b = 1 n d | ( a , b ) μ ( d ) n a ( 1 + n b ) n b 2

μ 提前即可, 然后变成要筛 μ ( d ) d 的前缀和,杜教筛即可,如果不会的可以翻到上文,前面有

1238 最小公倍数之和 V3

这题我没A。。T了
然后晚上无聊,卡了一手常数,就卡过了。。
用的是莫比乌斯反演的做法。。
式子不写了,很好推。。然而似乎是 n 3 4 的,所以应该理论上就过不去
不想学欧拉的做法了。。就这样吧

1819 黑白树 V2

蛮复杂的一个树剖
官方题解:

sum[i][j] 考虑令w[x][i][j]为(x的轻儿子的子树中满足dep[v] mod 2=i,col[v]=j的节点v的个数)*x,sum[i][j]即线段树节点代表的区间中的w[x][i][j]之和。
cnt[x][i][j] 表示x的子树中满足dep[v] mod 2=i,col[v]=j的节点v的个数
col[x]表示点x的颜色
tag[i] 表示对满足dep[x] mod 2=i的节点的翻转标记

感觉值维护轻儿子这个思想还是很不错的,然后每一次修改的时候,无论是改段还是改点,都是一直往上跳,每跳到一条轻链,就暴力更新代价。由于每个点最多经过 l o g n 条轻链,因此复杂度还是可以保证的。然后lazy标记打一打就可以了,对于不同奇偶性的深度都开一个lazy

1462 树据结构

副教练的题啊,我没做出来
感觉我再不学线段树合并的时间复杂度,这辈子都不敢打啊。。
因为不知道什么样的姿势才是对的,这样觉得可以A,但其实是T的,这样觉得会T,但其实是A的。
这题就对于每个节点维护两个以时间为下标的线段树,然后合并就很简单了

说下在树上面时间复杂度的分析:
首先,每个节点,有会动态开 l o g n 个点,然后一开始,整颗树有 n l o g n 个节点。然后我们考虑,每一次 M e r g e ,如果有节点是空,那么就马上返回了,这个复杂度是可以忽略不计的。然后如果两个节点都不为空,那么其中一个节点就会被“删除”,你以后都只会见到另外一个了。因此,每一个合法的操作,都会删除一个点。因为只有 n l o g n 个节点,因此最差复杂度就是 n l o g n

石子归并

对于第一个版本,直接 O ( n 3 ) 就可以了,20分到手。。
对于第二个版本,我们可以使用一个 O ( n 2 ) 的方法,考虑优化 n 3 的DP,这个要用到四边形不等式。正确性已经复杂度将在明天填坑
看了一个多小时的证明,都不是很懂。
现在知道怎么套式子:
对于形如这样的形式:
f [ i ] [ j ] = m i n ( f [ i ] [ k ] + f [ k + 1 ] [ j ] ) + w [ i ] [ j ]
如果 w [ i ] [ j ] 满足,若存在有 i i < j j ,且满足:
1. w [ i ] [ j ] > w [ i ] [ j ] (包含单调性)
2. w [ i ] [ j ] + w [ i ] [ j ] w [ i ] [ j ] + w [ i ] [ j ] (凸性)
f [ i ] [ j ] 的决策点为 s [ i ] [ j ]
则会满足 s [ i ] [ j 1 ] s [ i ] [ j ] s [ i + 1 ] [ j ]
由此,我们得到了一个 n 2 的做法
对于第三个版本,我们需要一个 O ( n l o g n ) 的做法
这个是一个比较奇怪的贪心,我也没有非常理解
只知道算法的内容,若存在有 s [ i ] s [ i 2 ] ,那么就把 s [ i 1 ] s [ i 2 ] 合并,然后将新的值,一直向前寻找位置插入,位置是第一个比他大的位置,然后再之前继续重复这个操作。网上没找到什么关于这个算法的讲解,自己试着猜了一下,觉得往前插入只是优化时间复杂度的,然后发现并不是,和正确性有很大的联系,于是就差不出算法的核心了。。留坑把

1294 修改数组

我们对于这种<的问题,一般可以对于每个数,都减去i,变成小于等于的
然后就变成一个十分经典的问题了,乱搞一下即可

2025 直角三角形的周长和

这题的话,还是很厉害的一个题吧。。
然后这题让我理解了一下线性筛,以前都是背板子,很惭愧啊
我买了题解QAQ
容斥肯定是不用说的
考虑怎么求 1 a n 1 b m 1 c l ,然后满足题意的有多少个
变一下式子, a 2 = ( c + b ) ( c b )
然后转化成枚举a的因数
a 2 = x y
x = y ( m o d 2 ) ( x < y )
就有:
b = ( y x ) / 2 , c = ( y + x ) / 2
我们可以枚举 x
设c为示最小的与x相乘是完全平方数的数,这个可以线性筛出来
因为x*y必须是一个完全平方数,所以y可以用 c d 2 的形式表示。
d 进行讨论,求出d的范围,就可以O(1)对于每一个 x ,算出它对答案的贡献了

1124 N!的非0最低位(没做完)

这题没做完,就不当作计划完成的一部分了
之前一个组合数最后若干位的弱化版
就先把2和5提出来,然算出前面的东西,中国剩余定理合并就可以了
由于要写高精度,于是拿完 l o n g l o n g 的分就跑了
下了第一个WA的数据,发现爆long long了,然后自己出了一个都过了,于是就安心地跑了

1587 半现串

十分简单的一个数位DP啊
在宿舍里面想了一下就出来了,然后今早感觉时间可能有点虚,但是还是写了,于是就过了。。
考虑对于每一个长度是 d / 2 的子串都建立在AC自动机上面,这样最多也就是 25 1000 个节点。然后我们就直接在AC自动机上面数位DP, f [ 51 ] [ 26 N ] [ 2 ] [ 2 ] 表示现在在第几位,在AC自动机上面是哪一个,是否没有限制,是否出现了合法串。然后就可以了
然后一开始还T了一个点,于是就考虑到有两次询问,如果已经没有限制了,状态是不用清除的,然后就可以通过这一题了

51nod20题的划水小计划终于结束了

最后勉强是以5位数收尾吧(其实我是看最后一题还差500分,特地找了个8级最水的题来做QAQ)
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_36797743/article/details/79011455
20)
$20
20