Codeforces Round #785 (Div. 2)
A、B
随便写
C
定义回文数为把数位倒置后值不变的数字,例如1,2,3,11,111,121
给定一个数字a(1≤n≤4⋅104),将其转换为多个回文数相加,求方案数
一句话题解:无限背包
有一个朴素的想法f[i][j]表示将数字i表示为j个回文数相加的方案数,那么有:
f[i][j] = sum(f[i-k][j-1]) k∈回文数
但是会超时。。。但是这勾引起一个叫做“背包DP计算方案数”的思路。。。
仔细一想,把回文数当成物品,这个其实就是一个无限背包问题。。。
D
有两个有限的等差数列A、B(指起点和长度的等差数列),将同时存在这两个数列中的数字拿出来构成数列C,显然C也是一个有限的等差数列
给出B、C,求可能的数列A有多少个
每个数列由x, y, z表示,x表示数列起点、y表示公差、z表示长度 (1≤x,y,z≤109)
其实不难,就是比较麻烦
1. A、B数列的公差的最小公倍数是C数列的公差
2.找到可能的公差之后就可以得出在C数列起点前A数列可能有多少个数字
这个比较好想,就是C数列起点Cx/Ay
3.最后考虑简单考虑一下不可能的情况和无限的情况就好了
F
交互题
一个n维的方格图,需要指定每条边的长度,对于一条从点A移动到点B的路径,给出这条路径上所有边长的xor和
从左上角开始进行k次移动,每次移动后给出经过路径上所有边长的xor和,需要给出每次移动后的坐标点
边长的总和不能超过48000,n小于等于32
思路很简单,给每个点设置一个唯一序号,点之间的路径为序号的xor
但是问题在于这样边长总和会超时
不想想了
看了一下题解,这个是二维的格雷码
主要的思路就是确保每两个点之间只有一位有变化,这样可以确保边长最小
感觉以这种思路做应该也是有构造方法的