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

本文深入解析了一场ACM竞赛中两道关键题目的解题思路,包括平面划分问题和基于莫比乌斯函数的数学问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这次在乌市现场赛的关键题是D和K,就这两个问题来实际探讨一下。
就比赛前一刻,我突然想起前1n1到n的平方和,然后我问东东通向公式是多少,最后我还是想起来,但是没想到,在比赛的时候这两个题还真的用着了。
现在还没有什么在线平台开放这套区域赛的题,所以只能拿自己在现场赛的纸质题目了。
D题:
这里写图片描述

题目大意就是在一个圆上,在其圆周上放置n个点,问最多可以划分多收个平面。
数据范围1<=T<=100000,1<=n<=10181<=T<=100000,1<=n<=1018
所以毫无疑问,这就是要推公式的了…
以前在《具体数学》上第一章有讲过类似问题,应该是最简单的那种,在一个无限大的平面上,给你n条直线,请问最多可以划分多少个平面,因为在这本书里断言这种直线划分问题的通向式都是2次的多项式,然而,我用待定系数解了之后发现根本不对,实际上此题的确是多项式,但不是2次,当时可能是太紧张了,发现题给的是点的个数,而不是线的个数。(所以如果是n个点,那么两两点相连,就是C2nCn2了,也就是是O(n2)O(n2)条直线,带到二次里,自然就是4次的多向式了,虽然不太严谨,但是如果当时这样这样做应该也很快做出来了)
那么就找规律看看。
n=1S1=1n=1,S1=1
n=2S2=2n=2,S2=2
n=3S3=4n=3,S3=4
n=4S4=8n=4,S4=8
n=5S5=16n=5,S5=16
是不是Sn=2n1Sn=2n−1?,当时代码都写好了,然后东东说验证一下n=6的情况,直接手写画了个圆,一笔一笔画出来hhh,但是S6=33S6=33,然后又画了一个还是33,看榜单这题wa的人不少,估价的确有可能都用这个公式去做了,所以的确应该不可能是指数项。
后来想了一会,感觉这个应该还是一个多项式式子,但是没办法确定最高次数是多少。那就把相邻两项做差,直到所有数均为0,操作之后,发现可能是3次的多项式,然后就待定系数去解方程了求:

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

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

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

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

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

所以f(n)=O(n3)f(n)=O(n3),那就证明了SnSn的系数绝对是4次,因为:若SnSn1=O(nk),Sn=O(nk+1)Sn−Sn−1=O(nk),则Sn=O(nk+1),这个组合数学书上是有的,当时书给了一个如何求解ni=1ik∑i=1nik的步骤,现在已经忘了。那个时候东东说算出所有5项的系数,除了e,其它系数都是分数,虽然和样例都一样,还是很不太确定,我说一定是4次的,去写吧,我来检查。后来写完,验证了一波之后,点了提交,心里还是有点没底,等待被裁决的感觉太煎熬了,过了一会系统返回了YES了,有点开心诶!1A。佩服东东有耐心解那个方程组。

接下来
K题:
这里写图片描述
题意:
Tr,c=c,gcd(r,c)=1,Tr,c=0,otherwiseTr,c=c,当gcd(r,c)=1,Tr,c=0,otherwise

Sr,c=i=crTr,iSr,c=∑i=crTr,i

求:
Sr=i=1rSr,iSr=∑i=1rSr,i

输入r,输出SrSr(1<=t<=10000,1<=r<=108)(1<=t<=10000,1<=r<=108)

当时过了D题,我心态好很多,可以看其他题了,当时班在研究K题,其实之前看过K和D,我觉得还是得先做D,K看完感觉很难下手,着实不好做,没有什么思路。而且过的人不多,当时想着又找规律,但是已经有过一道题了,不可能会再出一道,当时还是无进展啊(这题得做了2了个小时了)
但是仔细看了之后感觉有点熟悉,但是也不太确定,是不是莫比乌斯反演啊,也不是说反演,就是需要一些莫比乌斯函数的一些性质,试一试吧。
当时ban帮我把式子化简了,这个也比较关键
则:

ans=i=1ni2[gcd(i,n)==1?1:0]ans=∑i=1ni2∗[gcd(i,n)==1?1:0]

当时卡了一会,然后想到有:
d|nμ(d)=1,n=1,otherwise0∑d|nμ(d)=1,当n=1,otherwise均为0

则:
ans=i=1ni2d|gcd(i,n)μ(d)ans=∑i=1ni2∗∑d|gcd(i,n)μ(d)

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

i=dki=dk,则:
ans=d=1nμ(d)d2k=1ndk2ans=∑d=1nμ(d)∗d2∑k=1ndk2

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值