[蓝桥杯][2019年第十届真题]组合数问题(数位dp,卢卡斯定理)

个人题解链接,历届试题,正在更新中~
题目描述
给n,m,k,求有多少对 ( i , j ) (i,j) (i,j)满足 1 ≤ i ≤ n , 0 ≤ j ≤ m i n ( i , m ) 1 ≤ i ≤ n,0 ≤ j ≤ min(i,m) 1in,0jmin(i,m) C ( i , j ) ≡ 0 ( m o d k ) C(i,j) ≡ 0(mod k) C(i,j)0(modk),k 是质数。其中 C ( i , j ) C(i,j) C(i,j) 是组合数,表示从 i 个不同的数中选出j个组成 一个集合的方案数。

输入
第一行两个数 t, k,其中 t 代表该测试点包含 t 组询问,k 的意思与上文中 相同。

接下来 t 行每行两个整数 n, m,表示一组询问。

输出
输出 t 行,每行一个整数表示对应的答案。由于答案可能很大,请输出答 案除以 1 0 9 + 7 10^9 + 7 109+7的余数。

样例输入
1 2
3 3
样例输出
1
数据范围
n , m ≤ 1 0 18 , t ≤ 1 0 5 n,m ≤ 10^{18}, t ≤ 10^5 n,m1018,t105

思路
n和m很大,所以我们先想到卢卡斯定理。
在这里插入图片描述
化成p进制后,任意一个数都不可能是p的倍数,所以要使其和0同余一定是某一位上n<m的情况,(组合数中规定C(n,m),若n< m则结果为0).
所以题目意思转化为小于n和m的p进制数中有多少对数(i,j)i > j 且i中至少一位小于j,然后就可以愉快的数位dp了。在这里我们可以求它的对立,求i>=j,且i每一位都大于j的对数。由于p很大,所以不能使用记忆化搜索。所以只能推一波了。

转移方程:
定义三个函数

  1. LL calc(LL x, LL y) //x取值[0, x], y取值[0,y] x >=y的数量
  2. LL calc1(LL x, LL y) // x不变,y取值为[0,y] x >= y的数量
  3. LL calc2(LL x, LL y) // y不变 x取值为[0,x] x >= y的数量
  • d p [ i ] [ 0 ] dp[i][0] dp[i][0] :第i位无限制。
    d p [ i ] [ 0 ] = d p [ i − 1 ] [ 0 ] ∗ c a l c ( p − 1 , p − 1 ) + d p [ i − 1 ] [ 1 ] ∗ c a l c ( a [ i ] − 1 , p − 1 ) + d p [ i − 1 ] [ 2 ] ∗ c a l c ( p − 1 , b [ i ] − 1 ) + d p [ i − 1 ] [ 3 ] ∗ c a l c ( a [ i ] − 1 , b [ i ] − 1 ) , 要 使 第 i 位 无 限 制 , 可 以 从 上 一 位 的 无 限 制 转 移 过 来 , 也 可 以 从 i 到 达 上 界 的 数
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值