17年ACM/ICPC亚洲区域赛现场赛乌鲁木齐站(D题和K题)

这次在乌市现场赛的关键题是D和K,就这两个问题来实际探讨一下。
就比赛前一刻,我突然想起前 1n 1 到 n 的 平 方 和 ,然后我问东东通向公式是多少,最后我还是想起来,但是没想到,在比赛的时候这两个题还真的用着了。
现在还没有什么在线平台开放这套区域赛的题,所以只能拿自己在现场赛的纸质题目了。
D题:
17年ACM/ICPC亚洲区域赛现场赛乌鲁木齐站(D题和K题)_第1张图片

题目大意就是在一个圆上,在其圆周上放置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=1S1=1 n = 1 , S 1 = 1
n=2S2=2 n = 2 , S 2 = 2
n=3S3=4 n = 3 , S 3 = 4
n=4S4=8 n = 4 , S 4 = 8
n=5S5=16 n = 5 , S 5 = 16
是不是 Sn=2n1 S n = 2 n − 1 ?,当时代码都写好了,然后东东说验证一下n=6的情况,直接手写画了个圆,一笔一笔画出来hhh,但是 S6=33 S 6 = 33 ,然后又画了一个还是33,看榜单这题wa的人不少,估价的确有可能都用这个公式去做了,所以的确应该不可能是指数项。
后来想了一会,感觉这个应该还是一个多项式式子,但是没办法确定最高次数是多少。那就把相邻两项做差,直到所有数均为0,操作之后,发现可能是3次的多项式,然后就待定系数去解方程了求:

Sn=an3+bn2+cn+d S n = a n 3 + b n 2 + c n + d
,解一个四元四次方程,为了防止出错,然后我和东东同时开始解,但是我们俩怎么算都不一样,而且各自都确认过没有算错。告诉自己要冷静,再从头开始分析,然后再两两相减,发现应该是一个4次多项式才对,那就解吧:
Sn=an4+bn3+cn2+dn+e S n = a n 4 + b n 3 + c n 2 + d n + e

待定系数解一个五元五次方程,计算这种东西我都是力不从心的,然后东东去解了,我就想能不能不找规律,直接推导算了。
假设 Sn+1=Sn+f(n) S n + 1 = S n + f ( n ) ,我就想先确定这个 f(n) f ( n ) 也行啊,发现还是有点思路,假设在原先n个点基础之上,那么新加入一个点,则会产生n条新的直线,这个没什么问题,那么怎么产生新的区域,发现这取决于有多少条直线穿过每个新产生的线段,假设我看第i条线段,那么左边的点数是 i1 i − 1 ,右边是 ni n − i ,那么床过这第i条线段是 (i1)(ni) ( i − 1 ) ( n − i ) ,也就是说产生 (i1)(ni)+1 ( i − 1 ) ( n − i ) + 1 的新的平面
所以这个f(n)应该为:
f(n)=n+i=1n(i1)(ni) f ( n ) = n + ∑ i = 1 n ( i − 1 ) ( n − i )

那么实质上就是求
f(n)=n+i=1n(i1)(ni)=n+i=1n(ini2n+i) f ( n ) = n + ∑ i = 1 n ( i − 1 ) ( n − i ) = n + ∑ i = 1 n ( i n − i 2 − n + i )

关键是求
i=1ni2 ∑ i = 1 n i 2

这个自然就等于
(n+1)n(2n+1)6 ( n + 1 ) n ( 2 n + 1 ) 6

所以 f(n)=O(n3) f ( n ) = O ( n 3 ) ,那就证明了 Sn S n 的系数绝对是4次,因为:若 SnSn1=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题:
17年ACM/ICPC亚洲区域赛现场赛乌鲁木齐站(D题和K题)_第2张图片
题意:
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

Sr,c=i=crTr,i S r , c = ∑ i = c r T r , i

求:
Sr=i=1rSr,i S r = ∑ i = 1 r S r , i

输入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帮我把式子化简了,这个也比较关键
则:

ans=i=1ni2[gcd(i,n)==1?1:0] a n s = ∑ i = 1 n i 2 ∗ [ g c d ( i , n ) == 1 ? 1 : 0 ]

当时卡了一会,然后想到有:
d|nμ(d)=1,n=1,otherwise0 ∑ d | n μ ( d ) = 1 , 当 n = 1 , o t h e r w i s e 均 为 0

则:
ans=i=1ni2d|gcd(i,n)μ(d) a n s = ∑ i = 1 n i 2 ∗ ∑ d | g c d ( i , n ) μ ( d )

(莫比乌斯函数的这种用法也算是一种常规套路了)
推得:
ans=d=1nμ(d)d|ii<=ni2 a n s = ∑ d = 1 n μ ( d ) ∗ ∑ d | i i <= n i 2

i=dk i = d k ,则:
ans=d=1nμ(d)d2k=1ndk2 a n s = ∑ d = 1 n μ ( d ) ∗ d 2 ∑ k = 1 n d k 2

这里就又是
k=1ndk2 ∑ k = 1 n d k 2
求和,这里我是有公式在 O(1) O ( 1 ) 时间求得,所以只要预处理莫比乌斯函数,然后再通过 O(N) O ( N ) 时间处理,即可求得答案。但是推导的时候犯了一个致命错误,当时竟然也没有发现,若 d|gcd(i,n),d|id|n d | g c d ( i , n ) , 则 d | i 并 且 d | n ,则:
ans=d|nnμ(d)d2k=1ndk2 a n s = ∑ d | n n μ ( d ) ∗ d 2 ∑ k = 1 n d k 2
当时有点开心,以为是做出来了,直接开始找模板开始写莫比乌斯函数的模板,写完以后,我在看了一下数据范围,发现原来n可以到 108 10 8 ,肯定要超时的…当时陷在这个框里走不出了,觉得就应该是这样做的才对,真想不到还有其他什么思路,当时一直也没有发现这个错误。
过了很长时间,之前东东说能不能把一些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
ans=d|nnμ(d)d2g(nd) a n s = ∑ d | n n μ ( d ) ∗ d 2 ∗ g ( n d )

这用 μ(n) μ ( n ) 函数是方便描述,实际只要用状态压缩去枚举组合即可了
因为 μ(n) μ ( n ) 函数大多是为0。
最后写完代码了以后,过了样例交了一发,竟然re了,实在想不明白,然后检查了好长时间的代码,一直不敢交,就是增大了筛素数的范围,好像也没有其他什么改动,后来说直接交了,过了一会返回了YES,莫名其妙,至今都不知道第一发为什么错了,不过好歹还是过了,激动。
做完这题已经过去4个多小时,最后我的另外两个队友去研究C题了,我就找其他可以做的题,刚好离比赛快结束了,完成了C题的代码,我说交吧,反正也没时间了,结果是NO,意料之中,如果之前的题做快一点可以还有时间调试一下,不过似乎5题都铜了,也无所谓啦,最后5个小时的比赛就这样结束了。

这个终于是告一段落了,去迎接下一个挑战吧。

你可能感兴趣的:(数论,容斥原理,莫比乌斯反演,递推,赛后感想)