目标
又要来51nod滑水啦
主要是来做点数学题
看看做完20题以后可以到哪里吧
现在16题,才3480分。。感觉好少啊。。
希望这20题可以贡献多一点吧。。
由于数学居多,所以会非常劣质
题表
1675 序列变换
很棒的一个题啊,用的是这一个
我们先求出
F(i)
F
(
i
)
,表示左右gcd是i的倍数的和,然后再用上面这个形式变回去就可以了
1179 最大的最大公约数
很水的一个题啊。。
就暴力分解下因数,然后如果有一个因数出现次数超过2,那么就合法,从大到小扫一下就可以了
1188 最大公约数之和 V2
一开始想反演。。然后T了
后面那个其实就是欧拉函数。。
于是就得到了一个 O(n) O ( n ) 预处理,然后 O(n−−√) O ( n ) 询问的做法
但是这样并不可以 A A ,因为你会
于是我们要换一个做法,
于是就得到了一个预处理 O(nlogn) O ( n l o g n ) ,然后询问 O(1) O ( 1 ) 的做法
1239 欧拉函数之和
杜教筛的一个入门题啊!
我们知道
把i提出来可以得到
那么我们只需要后面那个值就可以了
因考虑枚举后面 d/i d / i 的值,可以得到
后面递归求解即可
1244 莫比乌斯函数之和
也是一个杜教筛入门题啊
我们知道
于是
还是一样的套路,枚举 i/d i / d
可以得到
于是后面递归去求解就好了
得到式子
1190 最小公倍数之和 V2
刚写完一次,然后崩溃了,文章没了,不想详细写了
感觉是bzoj2226的加强版啊
考虑到有了下界,如果用补集就有了上界,于是之前那题其中
F(n)
F
(
n
)
为一个数n小于等于他且和他互质的和 ,这个方法不好用了
于是考虑换一个方法
公式太多,给个链吧。。
但是其实在对拍的时候发现,余数个数是可以达到很大的,至少比500大。。
好像有1000的吧。于是我的数组一改再改,改到了10000才没有崩溃。。所以实在想卡,应该也卡得了。。但是数据随机啊,所以整体还是很快的。。
然后不知道为什么,我的代码很慢。。用了循环展开才成功卡过
1407 与与与与
还不错的一个题啊
开始想想想,想了半天才想回容斥,感觉要完
然后我们现在就需要知道
f[i]
f
[
i
]
,表示某些位是1的数有多少个
想了很多不靠谱的方法,比如说暴力bitset合并,这样是
106∗n/32
10
6
∗
n
/
32
,显然过不去。还有枚举子集DP,这样是
320
3
20
也过不去
于是我们考虑要使用一个更快的方法
直接求肯定是不行的,于是我们一位一位来
f[k][i]
f
[
k
]
[
i
]
表示前k位,&i=i,且后面的与i一样的有多少个
这样递推式就很显然了
如果
i
i
的第位是
1
1
,则
否则,
f[k][i]=f[k−1][i]+f[k−1][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
可以得到式子
(1−2–√)n=a−b2–√
(
1
−
2
)
n
=
a
−
b
2
上下相乘,得到
(−1)n=a2−2b2
(
−
1
)
n
=
a
2
−
2
b
2
当n是偶数的时候
1=a2−2b2
1
=
a
2
−
2
b
2
即
1+2b2=a2
1
+
2
b
2
=
a
2
当
m=a2
m
=
a
2
时,
m−1=2b2
m
−
1
=
2
b
2
恰好满足题意
然后当n为偶数的时候同理,然后这题就做完了
1237 最大公约数之和 V3
非常简单的一个反演题啊!!!还有640分,真是赚死了。。
由于式子太简单,就不写了,两部就推完了,就是一个欧拉
分块,然后强行上杜教筛就可以了
听说杜教筛由于又记忆化,所以时间复杂度是加上去的?
不管了,反正跑得特别快
2026 Gcd and Lcm
容易发现,f是一个积性函数
乱搞一下就发现,其实是问你f(i)的前缀和,然后平方一下
考虑这个怎么杜教筛
问题就转化成了求
因为
常用套路
然后就可以杜教筛了
感觉这题收获蛮大的啊,感觉学会了杜教筛的正确姿势
以前记忆化都是用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
主要是被限制在每一次枚举质数了。。没有动手推别的式子,真是失败。。
于是认真地写一次把
然后我居然就卡在这里了QAQ
另 d′=dp d ′ = d p
然后后面部分的前缀和可以 nlogn n l o g n 预处理,然后就可以根号询问了
1223 分数等式的数量
很棒的一个题啊!!看起来毫无思路,挣扎了一下就看题解了。。
题意明显的,就是问题
然后这个形式看起来无从下手,我们可以尝试着提取它的gcd
设 d=gcd(x,y),则x=di,y=dj d = g c d ( x , y ) , 则 x = d i , y = d j
问题变成了求
又因为 ij i j 互质,所以
设 m=(√n) m = ( n )
那么
直接求这个似乎并不好求
于是我们考虑反演一波, F(i) F ( i ) 表示,gcd是i的倍数的答案有什么,这样就好求了
这个是可以很快算出来的。。
然后有了这个,用反演公式,即可以把 gcd=1 g c d = 1 的给还原回去
然后我的代码巨慢。。跑 1011 10 11 本机要4s左右,卡了循环展开还是很慢。。于是买了最后一个数据,发现就是 1011 10 11 ,于是打了这个点,
1220 约数之和
和3994: [SDOI2015]约数个数和十分像的一个题吧。。其实就是进化版
是自己推出来的,还居然一次打对,感觉很开心啊
在这里纪念一下吧
你可以发现,其实后面就是一个常数乘上一个等差数列
吧 μ μ 提前即可, 然后变成要筛 μ(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
]
满足,若存在有
i≤i′<j≤j′
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][j−1]≤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[i−2]
s
[
i
]
≥
s
[
i
−
2
]
,那么就把
s[i−1]
s
[
i
−
1
]
和
s[i−2]
s
[
i
−
2
]
合并,然后将新的值,一直向前寻找位置插入,位置是第一个比他大的位置,然后再之前继续重复这个操作。网上没找到什么关于这个算法的讲解,自己试着猜了一下,觉得往前插入只是优化时间复杂度的,然后发现并不是,和正确性有很大的联系,于是就差不出算法的核心了。。留坑把
1294 修改数组
我们对于这种<的问题,一般可以对于每个数,都减去i,变成小于等于的
然后就变成一个十分经典的问题了,乱搞一下即可
2025 直角三角形的周长和
这题的话,还是很厉害的一个题吧。。
然后这题让我理解了一下线性筛,以前都是背板子,很惭愧啊
我买了题解QAQ
容斥肯定是不用说的
考虑怎么求
1≤a≤n1≤b≤m1≤c≤l
1
≤
a
≤
n
1
≤
b
≤
m
1
≤
c
≤
l
,然后满足题意的有多少个
变一下式子,
a2=(c+b)(c−b)
a
2
=
(
c
+
b
)
(
c
−
b
)
然后转化成枚举a的因数
设
a2=x∗y
a
2
=
x
∗
y
x=y(mod2)(x<y)
x
=
y
(
m
o
d
2
)
(
x
<
y
)
就有:
b=(y−x)/2,c=(y+x)/2
b
=
(
y
−
x
)
/
2
,
c
=
(
y
+
x
)
/
2
我们可以枚举
x
x
设c为示最小的与x相乘是完全平方数的数,这个可以线性筛出来
因为x*y必须是一个完全平方数,所以y可以用的形式表示。
对
d
d
进行讨论,求出d的范围,就可以O(1)对于每一个,算出它对答案的贡献了
1124 N!的非0最低位(没做完)
这题没做完,就不当作计划完成的一部分了
之前一个组合数最后若干位的弱化版
就先把2和5提出来,然算出前面的东西,中国剩余定理合并就可以了
由于要写高精度,于是拿完
longlong
l
o
n
g
l
o
n
g
的分就跑了
下了第一个WA的数据,发现爆long long了,然后自己出了一个都过了,于是就安心地跑了
1587 半现串
十分简单的一个数位DP啊
在宿舍里面想了一下就出来了,然后今早感觉时间可能有点虚,但是还是写了,于是就过了。。
考虑对于每一个长度是
⌊d/2⌋
⌊
d
/
2
⌋
的子串都建立在AC自动机上面,这样最多也就是
25∗1000
25
∗
1000
个节点。然后我们就直接在AC自动机上面数位DP,
f[51][26∗N][2][2]
f
[
51
]
[
26
∗
N
]
[
2
]
[
2
]
表示现在在第几位,在AC自动机上面是哪一个,是否没有限制,是否出现了合法串。然后就可以了
然后一开始还T了一个点,于是就考虑到有两次询问,如果已经没有限制了,状态是不用清除的,然后就可以通过这一题了
51nod20题的划水小计划终于结束了
最后勉强是以5位数收尾吧(其实我是看最后一题还差500分,特地找了个8级最水的题来做QAQ)