bzoj乱刷计划2 19/20

前言

话说第一个乱刷计划很顺利地完成了
感觉写成一个题表的形式还是很支持的
于是我决定再开一个。。

打算

依然是可以做自己没做过的题,也可以复习做过的。同时尽量学一些自己不会的吧

乱刷计划2

3158: 千钧一发

很简单的网络流吧。。以前一直以为很难
其实不难发现,偶+偶,和奇+奇都是合法的
因此你可以建立一个二分图,最小割就可以了
要注意的是,平方的时候会爆int

1449: [JSOI2009]球队收益

其实和之前剪刀石头布那道题是差不多的
但是这题多了一个东西,就是输了也有奖
那么这里就用到一个小技巧,就是先假设他全部输掉
然后慢慢赢回来,代价就减去输的那个,这样就和之前那题一样了
然后一开始我吧一开始win的也当做输掉,然后必须要他赢回来,但是发现这样非常慢。。T掉了,改了之后才A。。

2560: 串珠子

先是看错了一发题目,以为要是一棵树。。
然后很高兴地打了一个矩阵树定理。。还觉得数据才16,特别水。。然后发现死活过不了样例,才发现是连通图QAQ
然后就考虑容斥
用总的减去不合法的
表示两个状态 f[i] f [ i ] , g[j] g [ j ]
第一个是里面的是一定合法的,g是不合法的
然后枚举子集转移
怎么知道他不合法呢?
固定一个点,让他在其中一个块里面,这个状态为 f[a] f [ a ] ,然后不在另外一个里面,就是 g[b] g [ b ] ,两个乘起来即可

3240: [Noi2013]矩阵游戏

这题的话, nm n , m 给的是指数的形式,显然不是想让你一个矩乘就过了。。那么他应该给个 1018 10 18 就差不多了
于是我们要考虑优化
还是从矩阵出发
我们知道,行的矩阵大概是这样的:
a0b1 a b 0 1
在若干次乘法之后,会变成这样
an0b(a+a2+a3+a4+.....+an)1 a n b ( a + a 2 + a 3 + a 4 + . . . . . + a n ) 0 1
显然,后面的是一个等比数列
然后你会发现,最后都是乘方的形式
这让我们想起了费马小定理
虽然他是一个矩阵,但是我们从他的数的构成可看出,他也是可以用费马小定理来优化的
另外的矩阵也是同理,于是就成功吧时间复杂度降下来了
有一个小问题,就是当a=1的时候,他的形式是与膜数不互质了,那么费马小定理就不成立了,那怎么办呢?我们发现,如果这样的话,就退化成一个等差数列的形式了,于是其实他每隔 mod m o d 个也是一样的,于是将 mod1 m o d − 1 次幂调为 mod m o d 即可

4865: [Ynoi2017]由乃运椰子

明显地,方案肯定是放入单调上升的序列
那么问题就是问你有多少个单调上升的序列。。
那就是区间众数啊。。
但是考虑到空间只给了10M
所以传统的可能不太行
考虑压空间
1.调节块的大小,开 shortint s h o r t i n t
2.考虑到每个数,至少会有一次,所以全部如果只出现一次的数,都删掉好了。。其实出现的第一次都删掉也可以,然后最后答案+1就可以了
考虑到代码恶心,所以不想打了。。精神AC
QAQ

2440: [中山市选2011]完全平方数

很明显,是要二分答案
然后算里面有多少个
然后很明显,不喜欢的数是有一个质数出现次数为2次货以上,于是随便容斥一下就好了。发现容斥的系数刚好满足莫比乌斯函数,于是就可以了。。
发现如果答案太大,莫比乌斯函数不好预处理
猜一手结论,答案不会很大,打表发现,似乎不会超过 2n 2 ∗ n ,然后就没有了

2301: [HAOI2011]Problem b

莫比乌斯反演的应用啊!经典入门题啊!
不难发现,问题可以变成询问
1<=x<=n1<=y<=m(x,y)=k 1 <= x <= n 且 1 <= y <= m 且 ( x , y ) = k
把k提出来,可以变成
1<=x<=n/k1<=y<=m/k(x,y)=1 1 <= x <= ⌊ n / k ⌋ 且 1 <= y <= ⌊ m / k ⌋ 且 ( x , y ) = 1
即求 n/kx=1m/ky=1d|(x,y)μ(d) ∑ x = 1 ⌊ n / k ⌋ ∑ y = 1 ⌊ m / k ⌋ ∑ d | ( x , y ) μ ( d )
μ μ 提出去就可以了,然后可以分块优化
不想打公式了

2820: YY的GCD

很常用的一个手法啊,当要枚举两个数的时候,不妨枚举他们的积,然后就可以吧复杂度压成 O(n) O ( n ) 了。公式不想打了。。

2226: [Spoj 5971] LCMSum

还不错的一个题啊!
首先我们要推出

ans=i=1nlcm(i,n)=i=1nni(n,i)=ni=1ni(n,i) a n s = ∑ i = 1 n l c m ( i , n ) = ∑ i = 1 n n ∗ i ( n , i ) = n ∗ ∑ i = 1 n i ( n , i )

考虑枚举 gcd(i,n)=d g c d ( i , n ) = d
则有
ans=nd|nF(nd) a n s = n ∗ ∑ d | n F ( n d )

其中 F(n) F ( n ) 为一个数n小于等于他且和他互质的和
1. F(n)=phi(n)n/2 F ( n ) = p h i ( n ) ∗ n / 2
证明:
我们可以用类似等差数列求和的方式来证明
考虑到一个数i,如果 (n,i)=1 ( n , i ) = 1 ,则肯定有 (ni,i)=1 ( n − i , i ) = 1 ,因此,我们可以吧 i i (ni)分到一组,得到上式

2.莫比乌斯运用

F(x)=i=1xi[(x,i)=1]=i=1xid|(x,i)μ(d)=d|xμ(d)(d+2d+3d+4d+....+x) F ( x ) = ∑ i = 1 x i ∗ [ ( x , i ) = 1 ] = ∑ i = 1 x i ∗ ∑ d | ( x , i ) μ ( d ) = ∑ d | x μ ( d ) ∗ ( d + 2 d + 3 d + 4 d + . . . . + x )

后面那个可以用等差数列求和

但是每一次都这么求会很慢,于是我们可以为 F F ans都进行预处理,枚举他们的因数,扫过去,就可以 nlogn n l o g n

2154: Crash的数字表格

有两个方法,一个是 O(n) O ( n ) 的,一个是 O(n) O ( n )
先介绍一个 O(n) O ( n ) 的吧

Ans=i=1nj=1mlcm(i,j)=i=1nj=1mij(i,j)=d=1min(n,m)1in1jm(i,j)=dijd A n s = ∑ i = 1 n ∑ j = 1 m l c m ( i , j ) = ∑ i = 1 n ∑ j = 1 m i j ( i , j ) = ∑ d = 1 m i n ( n , m ) ∑ 1 ≤ i ≤ n 且 1 ≤ j ≤ m 且 ( i , j ) = d i j d

=d=1min(n,m)1ind1jmd(i,j)=1ijd = ∑ d = 1 m i n ( n , m ) ∑ 1 ≤ i ≤ ⌊ n d ⌋ 且 1 ≤ j ≤ ⌊ m d ⌋ 且 ( i , j ) = 1 i j d

然后我们考虑怎求解
G(n,m)=1in1jm(i,j)=1ij G ( n , m ) = ∑ 1 ≤ i ≤ n 且 1 ≤ j ≤ m 且 ( i , j ) = 1 i j

给定一个d,如果我们可以求出
F(n,m,d)=1in1jmd|(i,j)ij F ( n , m , d ) = ∑ 1 ≤ i ≤ n 且 1 ≤ j ≤ m 且 d | ( i , j ) i j

那么我们就可以用容斥可得
G(n,m)=F(n,m,1)(F,n,m,2)F(n,m,3)F(n,m,5)+F(n,m,6)...... G ( n , m ) = F ( n , m , 1 ) − ( F , n , m , 2 ) − F ( n , m , 3 ) − F ( n , m , 5 ) + F ( n , m , 6 ) . . . . . .

系数刚刚好就是 μ(d) μ ( d )
然后考虑怎么求出 F(n,m,d) F ( n , m , d )
不难发现
i=1nj=1mn(1+n)2m(1+m)2 ∑ i = 1 n ∑ j = 1 m n ( 1 + n ) 2 m ( 1 + m ) 2

然后对于F吧d提出来即可,然后我们就可以得到一个 O(n) O ( n ) 的做法了

一个询问 n n 的做法
不想写了。。再推一下式子,乱搞一下就可以了

3529: [Sdoi2014]数表

这里写图片描述

F[i] F [ i ] 表示是约数和,然后考虑到只有 F[i]a F [ i ] ≥ a 的是有用的,于是把 F[i] F [ i ] 按值拍个序,吧 a a 也排个序,单调加入就好了

3994: [SDOI2015]约数个数和

很简单的一个题啊

Ans=i=1nj=1ma|ib|j(i,j)=1

Ans=a=1nb=1mi|(a,b)μ(i)namb A n s = ∑ a = 1 n ∑ b = 1 m ∑ i | ( a , b ) μ ( i ) ∗ ⌊ n a ⌋ ⌊ m b ⌋

μ μ 提前就出来了,有一个东西要 n n 的时间复杂度预处理一下,然后就没有了

4176: Lucas的数论

上面一题的进化版
但其实做法是一样的,不过加了个杜教筛,然后后面分块可以暴力算
栋老师给我证明了是 n34 n 3 4 的,然而我不是特别懂。。反正可以过就是了

2553: [BeiJing2011]禁忌

今天感觉有点感冒,效率很低啊。。白天几乎就处于挂机状态,感觉药丸了
这题其实不怎么难。。
就建立一下AC自动机,然后记录一个某个节点到某个节点的概率,然后矩阵快速幂转移即可

3244: [Noi2013]树的计数

这题还是很棒的一个题啊,玩了我一个晚上
当然,可能有玩错的,如果有,最好在评论里面纠正一下吧
但我也没有证明有有其他情况使得下面三种情况出现
我们先用bfs序把dfs序重新标号
我们设新的编号 i i ,在dfs序里面的排名是id[i]
然后我们就顺着编号走,这样就相当于高度从大到小走下来了
考虑三种情况:
1.第i号点不可以和第i-1号点在同一层,这样的话, ans++ a n s + +
2.第i号点可以(也可不在)和第i-1号点在同一层,这样的话, ans=ans+0.5 a n s = a n s + 0.5
3.如果一定要在同一层,那么ans不变
然后我们考虑什么时候会有第一种情况,那就是当在 id[i]<id[i1] i d [ i ] < i d [ i − 1 ] ,这个很显然把
然后考虑什么时候会是第二个情况,这样就是说, id[i]=id[i1] i d [ i ] = i d [ i − 1 ] ,并且考虑到无论i和i-1处于什么位置关系,整个序列的bfs和dfs序都不会改变。这就说明,剩下的点都在i这颗子树里面,因为bfs序随着编号变大,深度肯定变大。然后如果有的点与它在同一层里面,那么它的改变,肯定是会使得别的改变的。于是我们考虑怎么知道剩下的点是不是都是他的子树,我们考虑到,一颗子树的dfs序是连续的,所以剩下的节点也是连续的,通过这个判断就可以了

1001: [BeiJing2006]狼抓兔子

直接建立对偶图跑一跑就可以了

4423: [AMPPZ2013]Bytehattan

直接建立对偶图跑一跑就可以了

2007: [Noi2010]海拔

仔细想想,其实和1001是一样的

2151: 种树

复习了一下
一个可以后悔的贪心啊
这次是自己想出来了,可能是以前做过的缘故吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值