题意:给你一组序列,让你从这中间选取m个数,使他们的差都是k的倍数的方案数是多少
思路:点击打开链接
和这道cf的题差不多都是一个思路的,讲一下把,就是
A%k == n
B%k == n 可以推出 (A-B) % K ==0
自己写几个式子看看, 其实这个式子我是会证明的,不过这里太小写不下嗯,就是这样,
那么
方法1:
我们统计余数,余数相同的数量(ans)大于m的我们从中选择m个那就是组合数 C(ans,m),之后我们遍历余数就好了,正确性。。emm不会证明正确性。。。
方法2:
dp,有了上面的性质我们可以知道,对于一个我们选出来长度为l的集合(集合中他们做差都是k的倍数),那我们当前如果遇到一个数字j,如果他和我们长度为l的集合中的任意一个做差是k的倍数,那么j就和这个集合中的所有数做差都是k的倍数,这里我们就可以推出转移方程了。
定义:
我们假设 dp[i][j] 表示的是当前我们凑出的集合长度为i,集合的末位数字是j的方案数是多少
初始化:
知道定义了,