第七届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),答案的式子可以写成
由二次剩余(或其他)的理论,(sumlimits_{i=0}^{p-1} i^m=0),所以式子其实就是
把后面那东西爆开来,得到
后面的东西是一个自然数幂和,可以证明它等于(-[m+k=p-1]),方法可以用斯特林数+卢卡斯定理,或是其他更好的做法。
所以最终答案就是((-1)^{m+1})。
我真的不会算不取模的值啊/kk
Div1 D
不会,咕了。
以上是关于第七届Code+编程大赛划水记的主要内容,如果未能解决你的问题,请参考以下文章
nyoj1254 Code the Tree (第七届河南省程序设计大赛)
2021年大学生网络安全邀请赛暨第七届上海市大学生网络安全大赛“东华杯”Misc(全)-Writeup
nyoj1255 Rectangles(第七届河南省程序设计大赛)