这次在乌市现场赛的关键题是D和K,就这两个问题来实际探讨一下。
就比赛前一刻,我突然想起前
1到n的平方和
1
到
n
的
平
方
和
,然后我问东东通向公式是多少,最后我还是想起来,但是没想到,在比赛的时候这两个题还真的用着了。
现在还没有什么在线平台开放这套区域赛的题,所以只能拿自己在现场赛的纸质题目了。
D题:
题目大意就是在一个圆上,在其圆周上放置n个点,问最多可以划分多收个平面。
数据范围
1<=T<=100000,1<=n<=1018
1
<=
T
<=
100000
,
1
<=
n
<=
10
18
所以毫无疑问,这就是要推公式的了…
以前在《具体数学》上第一章有讲过类似问题,应该是最简单的那种,在一个无限大的平面上,给你n条直线,请问最多可以划分多少个平面,因为在这本书里断言这种直线划分问题的通向式都是2次的多项式,然而,我用待定系数解了之后发现根本不对,实际上此题的确是多项式,但不是2次,当时可能是太紧张了,发现题给的是点的个数,而不是线的个数。(所以如果是n个点,那么两两点相连,就是
C2n
C
n
2
了,也就是是
O(n2)
O
(
n
2
)
条直线,带到二次里,自然就是4次的多向式了,虽然不太严谨,但是如果当时这样这样做应该也很快做出来了)
那么就找规律看看。
n=1,S1=1
n
=
1
,
S
1
=
1
n=2,S2=2
n
=
2
,
S
2
=
2
n=3,S3=4
n
=
3
,
S
3
=
4
n=4,S4=8
n
=
4
,
S
4
=
8
n=5,S5=16
n
=
5
,
S
5
=
16
是不是
Sn=2n−1
S
n
=
2
n
−
1
?,当时代码都写好了,然后东东说验证一下n=6的情况,直接手写画了个圆,一笔一笔画出来hhh,但是
S6=33
S
6
=
33
,然后又画了一个还是33,看榜单这题wa的人不少,估价的确有可能都用这个公式去做了,所以的确应该不可能是指数项。
后来想了一会,感觉这个应该还是一个多项式式子,但是没办法确定最高次数是多少。那就把相邻两项做差,直到所有数均为0,操作之后,发现可能是3次的多项式,然后就待定系数去解方程了求:
待定系数解一个五元五次方程,计算这种东西我都是力不从心的,然后东东去解了,我就想能不能不找规律,直接推导算了。
假设 Sn+1=Sn+f(n) S n + 1 = S n + f ( n ) ,我就想先确定这个 f(n) f ( n ) 也行啊,发现还是有点思路,假设在原先n个点基础之上,那么新加入一个点,则会产生n条新的直线,这个没什么问题,那么怎么产生新的区域,发现这取决于有多少条直线穿过每个新产生的线段,假设我看第i条线段,那么左边的点数是 i−1 i − 1 ,右边是 n−i n − i ,那么床过这第i条线段是 (i−1)(n−i) ( i − 1 ) ( n − i ) ,也就是说产生 (i−1)(n−i)+1 ( i − 1 ) ( n − i ) + 1 的新的平面
所以这个f(n)应该为:
那么实质上就是求
关键是求
这个自然就等于
所以 f(n)=O(n3) f ( n ) = O ( n 3 ) ,那就证明了 Sn S n 的系数绝对是4次,因为:若 Sn−Sn−1=O(nk),则Sn=O(nk+1) S n − S n − 1 = O ( n k ) , 则 S n = O ( n k + 1 ) ,这个组合数学书上是有的,当时书给了一个如何求解 ∑ni=1ik ∑ i = 1 n i k 的步骤,现在已经忘了。那个时候东东说算出所有5项的系数,除了e,其它系数都是分数,虽然和样例都一样,还是很不太确定,我说一定是4次的,去写吧,我来检查。后来写完,验证了一波之后,点了提交,心里还是有点没底,等待被裁决的感觉太煎熬了,过了一会系统返回了YES了,有点开心诶!1A。佩服东东有耐心解那个方程组。
接下来
K题:
题意:
Tr,c=c,当gcd(r,c)=1,Tr,c=0,otherwise
T
r
,
c
=
c
,
当
g
c
d
(
r
,
c
)
=
1
,
T
r
,
c
=
0
,
o
t
h
e
r
w
i
s
e
求:
输入r,输出 Sr S r (1<=t<=10000,1<=r<=108) ( 1 <= t <= 10000 , 1 <= r <= 10 8 )
当时过了D题,我心态好很多,可以看其他题了,当时班在研究K题,其实之前看过K和D,我觉得还是得先做D,K看完感觉很难下手,着实不好做,没有什么思路。而且过的人不多,当时想着又找规律,但是已经有过一道题了,不可能会再出一道,当时还是无进展啊(这题得做了2了个小时了)
但是仔细看了之后感觉有点熟悉,但是也不太确定,是不是莫比乌斯反演啊,也不是说反演,就是需要一些莫比乌斯函数的一些性质,试一试吧。
当时ban帮我把式子化简了,这个也比较关键
则:
当时卡了一会,然后想到有:
则:
(莫比乌斯函数的这种用法也算是一种常规套路了)
推得:
设 i=dk i = d k ,则:
这里就又是
过了很长时间,之前东东说能不能把一些gcd不是1的筛掉,这个我在之前一直没怎么仔细想,感觉想到了一些东西,假设n为6,那么2,3,6都是没有贡献的,是因为gcd不为1,那么实际上这个应该和n的性质有关,这个就是质数,也就是所有n的质因子,是容斥原理噢。
先筛出所有n的素因子,然后再容斥答案,n的范围当时极端情况不会超过10个,也就是2的10次方,10000个样例应该完全可以应付
所以:
设:g(n)=1+22+32+...+n2 设 : g ( n ) = 1 + 2 2 + 3 2 + . . . + n 2
这用 μ(n) μ ( n ) 函数是方便描述,实际只要用状态压缩去枚举组合即可了
因为 μ(n) μ ( n ) 函数大多是为0。
最后写完代码了以后,过了样例交了一发,竟然re了,实在想不明白,然后检查了好长时间的代码,一直不敢交,就是增大了筛素数的范围,好像也没有其他什么改动,后来说直接交了,过了一会返回了YES,莫名其妙,至今都不知道第一发为什么错了,不过好歹还是过了,激动。
做完这题已经过去4个多小时,最后我的另外两个队友去研究C题了,我就找其他可以做的题,刚好离比赛快结束了,完成了C题的代码,我说交吧,反正也没时间了,结果是NO,意料之中,如果之前的题做快一点可以还有时间调试一下,不过似乎5题都铜了,也无所谓啦,最后5个小时的比赛就这样结束了。
这个终于是告一段落了,去迎接下一个挑战吧。