如何求一个组合数的除以一个质数的余数

问题的引出

leetcode上的1223题:投掷一个骰子n次,并给出一个长度为6的数组,数值不超过15,分别表示1,2,3,4,5,6不能连续出现的次数,求投这n次可能出现的满足要求的序列的种数。用一个三维数组 a [ 6 ] [ 16 ] [ n ] a[6][16][n] a[6][16][n]进行动态规划就可以解决。但是现在加强一下限制,去掉限制中连续出现的条件,即数组每个数分别表示1,2,3,4,5,6在序列中能够出现的最大次数。可以用一个二维数组 a [ 6 ] [ n ] a[6][n] a[6][n]来进行动归, a [ i ] [ j ] a[i][j] a[i][j]表示投掷 j j j次只出现前 i i i个数的情况数。动归方程为 a [ i ] [ j ] = ∑ k = 0 m i n ( r [ i ] , j ) C j k a [ i − 1 ] [ j − k ] a[i][j]=\sum_{k=0}^{min(r[i],j)}C_j^ka[i-1][j-k] a[i][j]=k=0min(r[i],j)Cjka[i1][jk],其中 r [ i ] r[i] r[i]表示数字 i i i能出现的最大次数。发现递归式子中有组合数,只要n稍微大一些,就会出现组合数超过int表示范围的情况,因此题目要求输出模 1 0 9 + 7 10^9+7 109+7的结果。因此这里就涉及到求组合数的除以一个质数的余数的问题,如果是排列数,那很简单,因为只有乘法,现在麻烦的是组合数里面有除法,不能使用简单的同余公式来求。

问题的解决

我在网上查找带除法的同余问题,发现可以通过求分母的逆元来解决,求逆元的方法具体参考这里。比如要求 a / b a/b a/b除以质数 c c c的余数,由于质数的同余构成一个群,我们可以求出 b b b的逆元 b ′ b' b,这样就只需要求 a ∗ b ′ a*b' ab除以 c c c的余数了。

### 回答1: 好的,关于未知数a的boolean表达式可以写成: a == null || a == false || a == true 意思是如果a是null或者false或者true其中任意一个值,整个表达式的值就为真(True)。如果a是其它的值,整个表达式的值就为假(False)。 ### 回答2: 未知数a可以用boolean来表达,我们可以使用一个boolean变量来表示a的某个特定属性或条件是否成立。 例如,我们可以定义一个boolean变量isPositive来表示a是否为正数。如果isPositive为true,则表示a是一个正数;如果isPositive为false,则表示a不是一个正数。 我们还可以定义一个boolean变量isEven来表示a是否为偶数。如果isEven为true,则表示a是一个偶数;如果isEven为false,则表示a不是一个偶数。 另外,我们还可以定义一个boolean变量isDivisibleBy3来表示a是否能被3整除。如果isDivisibleBy3为true,则表示a能被3整除;如果isDivisibleBy3为false,则表示a不能被3整除。 当然,这只是一些例子,我们可以根据具体情况定义更多的boolean变量来描述a的各个性质或条件。利用boolean,我们可以方便地表示和判断未知数a的属性和条件,进而进行相关的逻辑操作。 ### 回答3: 假设有一个未知数a,我们可以用boolean变量来描述与a相关的一些属性或条件。 首先,我们可以定义一个boolean变量isPositive来表示a是否是正数。如果a大于0,则isPositive为true;如果a小于等于0,则isPositive为false。 另外,我们可以定义一个boolean变量isEven来表示a是否是偶数。如果a除以2的余数为0,则isEven为true;否则isEven为false。 还可以定义一个boolean变量isPrime来表示a是否是质数。判断一个数是否为质数可以通过遍历小于a的所有正整数,如果存在一个能整除a的数,则isPrime为false;如果都不能整除a,则isPrime为true。 除此之外,我们还可以定义一个boolean变量isZero来表示a是否为0。如果a等于0,则isZero为true;否则isZero为false。 最后,我们可以定义一个boolean变量isSquare来表示a是否为完全平方数。可以遍历小于等于a的正整数n,如果n的平方等于a,则isSquare为true;否则isSquare为false。 以上只是几个关于未知数a的例子,实际上可以通过组合不同的boolean变量来描述更多的属性或条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值