2017.2.10【初中部 GDKOI】模拟赛B组

今天的比赛又翻车了,第一题竟然忘了用高精度。


T1:走回头路的情况只有左右重复,所以我们设往上走为1,往左走为2,往右走为3。那么问题转换为在一个长度为n的序列的每个位置上填1、2、3中任意一个数字,其中2、3不能相邻,有多少种填法。那么我们可以用dp。设f[i][1/2/3]表示第i为填1或2或3,则

f[i][1]=f[i-1][1]+f[i-1][2]+f[i-1][3]

f[i][2]=f[i-1][1]+f[i-1][2]

f[i][3]=f[i-1][1]+f[i-1][3]。

注意要用高精度。


T2:这题是递归。

我们可以对行进行一次递归。递归枚举每一行选不选,不选直接跳至下一行,选就把这行几接下来的r-1行的'.'都改为'X',在每次递归后,按顺序覆盖列,最终选出最小的ans就行了。


T3:这题要用到指数连乘的求约数个数的公式。

我们可以以n为行,k为列列一个表格,表格中每一个格子就是n!k的值。那么0行k列都是1,n行0列都是n,其他格子就等于它上面的格子加下面的格子。我们可以用递推求出的n行k列格子的值,再求它约数的个数,但这样会炸。我们知道一个数的约数个数只与它的质因数和指数有关,于是我们只用保存每个格子的值的质因数的指数,递推时只要把相同的质因数的指数加起来就行了。

于是,我们设f[i][j][l]表示表格中i行j列的数所对应的第l个质数的指数的值。那么我们可以先求出1000以内的质数,初始化的时候把n行0列分解质因数并保存,然后在递推时把上面和左边相加,最后就把n行k列的质数加1连乘就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值