第七届Code+编程大赛划水记

Posted p-b-p-b

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第七届Code+编程大赛划水记相关的知识,希望对你有一定的参考价值。

作为鸽子,回到家已经不想开电脑了,于是当场外选手快乐口胡。

div2的AB就咕了吧。

以下全都是口胡!

Div1 A

T1就来构造题不太好吧/kk

考虑如何操作一个序列:显然应该每次找最靠前的(a_i=i)的位置,然后操作它。

考虑如何算出一个长度固定的序列能操作多少次(在合法的情况下):从后往前推,设后面一共操作了(x)次,那么加上这个位置之后就会操作(x+lceil x/i ceil)次。还有一个特例:如果(i|x),那么也可以操作(x+x/i+1)次。

注意到这个特例有点意思,所以可以发现长度固定的序列,后缀操作的次数是一个区间内的任意整数。

不妨大胆猜想长度(n)是可以二分的,那么二分(n)之后做一遍上面的倒推,即可求出(n)过大还是过小,或是构造出解。

经过打表可以发现(n)大概是(2 imes 10^6)级别的。

这样直接做复杂度(O(nlog n)),被出题人卡掉了。

我的想法:打表,预处理几个(n)出来,然后就可以减小二分范围,或是干脆把([1,10^{12}])都覆盖掉。

题解做法:打表,发现(frac{n^2}{n+k})会趋近一个叫(pi)的神秘常数,那么可以缩小二分范围。

Div1 B

离线,把每个位置第一次出现的时间给处理出来。

由于每一种权值被触发的次数之和是(O(nln n))的,所以考虑把每一个权值的答案都处理出来。

于是对于一个权值,我们可以求出它在什么时间之后才能跳(i)次。

然后就做完了???

也可以直接在线做,每次修改的时候把能往后跳的权值找出来暴力跳。

由于场上降智了并没有想到怎么把能往后跳的权值找出来

Div1 C

见到数论当场暴毙……

赛后想了一下有一些思路,不过还是只会(p)是质数的情况。设(P=prod p_i),那么显然可以把每一个(p)的答案乘起来(用中国剩余定理证明),但是我只会算(p_i)的答案模(p_i)得到的值。

滚去看题解,然后……

技术图片

我太难了,而且现在我还是不会证/kk

丢个(p)是质数的做法就跑吧/kk

先把式子换成(x+yequiv apmod{p}),然后对于每一组((x,y)),方案数是两者二次剩余的解的个数相乘。

然后把(y)换成(a-x)

由二次剩余的理论,(sqrt x)的解的个数就是(x^{(p-1)/2}+1pmod p),所以令(m=(p-1)/2),答案的式子可以写成

[sum_{i=0}^{p-1} (i^m+1)((a-i)^m+1) ]

由二次剩余(或其他)的理论,(sumlimits_{i=0}^{p-1} i^m=0),所以式子其实就是

[sum_{i=0}^{p-1} i^m(a-i)^m ]

把后面那东西爆开来,得到

[sum_{k=0}^m a^{m-k}(-1)^k{mchoose k}sum_{i=0}^{p-1} i^{m+k} ]

后面的东西是一个自然数幂和,可以证明它等于(-[m+k=p-1]),方法可以用斯特林数+卢卡斯定理,或是其他更好的做法。

所以最终答案就是((-1)^{m+1})

我真的不会算不取模的值啊/kk

Div1 D

不会,咕了。

以上是关于第七届Code+编程大赛划水记的主要内容,如果未能解决你的问题,请参考以下文章

nyoj1254 Code the Tree (第七届河南省程序设计大赛)

2021年大学生网络安全邀请赛暨第七届上海市大学生网络安全大赛“东华杯”Misc(全)-Writeup

第七届中国国际 “互联网+”大学生创新创业大赛记录

nyoj1255 Rectangles(第七届河南省程序设计大赛)

nyoj1253 Turing equation(第七届河南省程序设计大赛)

第七届蓝桥杯大赛个人赛省赛(软件类)B组