洛谷竞赛题目讲解_P1641(排列组合 + 整数乘法逆元)
2022-10-20 10:46 作者:Clayton_Zhou | 我要投稿
AC代码
https://www.luogu.com.cn/record/90637978
题意:
把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,
1的个数不能少于0的个数。 求符合条件字符串 个数。
题解:
排列组合 + 整数乘法逆元
可以考虑把1的个数与0的个数的和看成x坐标,
1的个数与0的个数的差看成y坐标 :
向右上走(x坐标加1,y坐标加1)就表示这个字符选择1。
向右下走(x坐标加1,y坐标减1)就表示这个字符选择0。
这样子,如果不考虑限制条件,就表示从(0,0)走n+m步到达(n+m,n-m),
这相当于从n+m步中选出m步向右下走,也就是组合数C(n+m,m)。
考虑限制条件,任意前缀中1的个数不少于0的个数,也就是这条路径不能经过直线y=-1。
可以通过对称性发现,从(0,0)走到直线y=-1上的一点,相当于从(-2, 0)走到该点。
也就是说,路径经过直线y=-1的方案数就是从(-2, 0)走n+m步到达(n+m,n-m),
这个方案数可以用组合数表示为C(n+m,m-1), 右下走的步数减一