「考试总结2021-04-07」进退

A. A

考虑枚举中位数,然后求一个最大的平均值

那么显然是在左边和右边取相同数量的最大值

发现这个东西是一个单峰函数,所以上个三分就能过了

比较尴尬的是考场第一次写三分,没有判断 \(f(lmid)=f(rmid)\) 的情况,挂掉很可观的分数

其实对于偶数的情况考虑右边的数的贡献就能证明必然相连,更进一步还能证明不存在偶数比奇数更优的情况

B. B

设 \(dp[i][j][0/1]\) 表示前 \(i\) 个数有 \(j\) 对冲突,最后一个数是不是构成冲突的方案数

那么转移考虑新加入的数是不是构成一个新的冲突就能得到 \(7\) 个转移

f[i+1][j][1]=add(f[i][j][1],f[i+1][j][1]);
f[i+1][j][0]=add(f[i+1][j][0],f[i][j][0]*max(i-j-1,0ll)%mod);
f[i+1][j][0]=add(f[i+1][j][0],f[i][j][1]*max(i-j,0ll)%mod);
if(j<i){
    f[i+1][j+1][1]=add(f[i][j][0]*2%mod,f[i+1][j+1][1]);
    f[i+1][j+1][1]=add(f[i][j][1],f[i+1][j+1][1]);
}
if(j>=1){
    f[i+1][j-1][0]=add(f[i+1][j-1][0],f[i][j][0]*j%mod);
    f[i+1][j-1][0]=add(f[i+1][j-1][0],f[i][j][1]*(j-1)%mod);
}

C.C

首先注意 \(FFT\) 预处理单位根的时候是 (complex){cos(pi/len*j),opt*sin(pi/len*j)};

也就是把 \(j\) 放到里面

不难写出来一个很多维的 \(dp\) ,每次枚举能新加入的数字来转移,最后再限制 \(2,5\) 做一次

同时也可以把它压到 \(2\) 维,也就是取 \(3,7,11,47\) 的公倍数,最后除一下

考虑有这样一个东西:\(10^{138} \equiv 1 \mod (3\times 7\times 11\times 13)\),这个东西可以使用各种方法得到,比如阶和 \(\varphi\)

那么把 \(dp\) 式子写出其 \(\mathrm{OGF}\) 就可以得到转移是一个循环卷积的形式

那么可以预处理 \(138\) 位,然后多项式快速幂做,不够的部分可以暴力跑一下

上一篇:138. 复制带随机指针的链表


下一篇:2016-2017 2 20155335《java程序设计》第四周总结