51nod进阶计划 20/20

目标

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

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

题表

1675 序列变换

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

1179 最大的最大公约数

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

1188 最大公约数之和 V2

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

Ans>g=1ngi=1n/gj=1n/g(i,j)=1>>i=1nn/in/id|idμ(u/i) 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 ) 预处理,然后 O(n) O ( n ) 询问的做法
但是这样并不可以 A A ,因为你会T
于是我们要换一个做法, 比较懒,不想写公式了
于是就得到了一个预处理 O(nlogn) O ( n l o g n ) ,然后询问 O(1) O ( 1 ) 的做法
这里写图片描述

1239 欧拉函数之和

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

d|nϕ(d)=n ∑ d | n ϕ ( d ) = n

ϕ(n)=nd|nd<nϕ(d) ϕ ( n ) = n − ∑ d | n 且 d < n ϕ ( d )

Ans=i=1n(id|id<iϕ(d)) A n s = ∑ i = 1 n ( i − ∑ d | i 且 d < i ϕ ( d ) )

把i提出来可以得到
Ans=n(n+1)2i=1nd|id<iϕ(d) A n s = n ∗ ( n + 1 ) 2 − ∑ i = 1 n ∑ d | i 且 d < i ϕ ( d )

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

后面递归求解即可

1244 莫比乌斯函数之和

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

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

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

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

于是后面递归去求解就好了
得到式子
Ans=1i=2nM(ni) A n s = 1 − ∑ i = 2 n M ( ⌊ n i ⌋ )

1190 最小公倍数之和 V2

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

1407 与与与与

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

1537 分解

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

1237 最大公约数之和 V3

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

2026 Gcd and Lcm

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

i=1nd|iμ(d)d=i=1nd=1niμ(d)d ∑ i = 1 n ∑ d | i μ ( d ) ∗ d = ∑ i = 1 n ∑ d = 1 ⌊ n i ⌋ μ ( d ) ∗ d

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

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

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

1594 Gcd and Phi

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

1192 Gcd表中的质数

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

Ans=p=1(p)min(n,m)d=1min(n,m)μ(d)ndpmdp 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=dp d ′ = d p
d=1min(n,m)ndmdp|dμ(p) ∑ d ′ = 1 m i n ( n , m ) n d ′ m d ′ ∗ ∑ p | d ′ μ ( p )

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

1223 分数等式的数量

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

x=1ny=i+1nx+y|xy ∑ x = 1 n ∑ y = i + 1 n x + y | x y

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

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

m=(n) m = ( n )
那么
Ans=i=2mj=1ini(i+j)(i,j)=1 A n s = ∑ i = 2 m ∑ j = 1 i ⌊ n i ( i + j ) ⌋ ( i , j ) = 1

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

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

1220 约数之和

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

Ans=i=1nj=1na|ib|jajbd|(a,b)μ(d)=a=1nb=1nd|(a,b)μ(d)a|ib|jajb 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

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

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

1238 最小公倍数之和 V3

这题我没A。。T了
然后晚上无聊,卡了一手常数,就卡过了。。
用的是莫比乌斯反演的做法。。
式子不写了,很好推。。然而似乎是 n34 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的节点的翻转标记

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

1462 树据结构

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

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

石子归并

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

1294 修改数组

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

2025 直角三角形的周长和

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

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

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

1587 半现串

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值