传送门

这是一道让我重新认识lucaslucaslucas的题。

考虑到lucaslucaslucas定理:

(nm)≡(n%pm%p)∗(npmp)\binom n m \equiv \binom {n\%p} {m\%p}*\binom{\frac n p}{\frac m p}(mn​)≡(m%pn%p​)∗(pm​pn​​) (mod(mod(mod p)p)p)

所以可以看成(nm)\binom n m(mn​)在p进制下的表示

于是这道题就可以用这个方法转换成求C(i,j)C(i,j)C(i,j)某一个进制位上满足ip&lt;jpi_p&lt;j_pip​<jp​的方案数。

然后可以通过容斥转一转变成求某一位ip≥jpi_p\geq j_pip​≥jp​的方案数。

于是就可以上数位dpdpdp了。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m;
const int mod=1e9+7,inv2=(mod+1)/2;
int T,k,f[70][2][2],sum[105][105],numn[70],numm[70],lenn=0,lenm=0;
inline int S(ll x){return x%=mod,(ll)x*(x+1)%mod*inv2%mod;}
inline int calc(ll a,ll b){return (S(a)-S(a-min(a,b))+mod)%mod;}
int main(){
	scanf("%d%d",&T,&k);
	for(int i=0;i<=k;++i)for(int j=0;j<=k;++j)sum[i][j]=calc(i,j);
	while(T--){
		scanf("%lld%lld",&n,&m);
		if(n<m)m=n;
		int ans=calc(n+1,m+1);
		memset(f,0,sizeof(f)),lenn=lenm=0;
		while(n)numn[++lenn]=n-n/k*k,n/=k;
		while(m)numm[++lenm]=m-m/k*k,m/=k;
		while(lenm<lenn)numm[++lenm]=0;
		f[n=lenn][1][1]=1;
		for(int i=n;i;--i){
			int upn=numn[i],upm=numm[i];
			f[i-1][1][1]=f[i][1][1]*(upn>=upm);
			f[i-1][1][0]=((ll)f[i][1][0]*(upn+1)%mod+(ll)f[i][1][1]*min(upn+1,upm)%mod)%mod;
			f[i-1][0][1]=((ll)f[i][1][1]*max(upn-upm,0)%mod+(ll)f[i][0][1]*(k-upm)%mod)%mod;
			f[i-1][0][0]=(((ll)f[i][0][0]*sum[k][k]%mod+(ll)f[i][0][1]*sum[k][upm])%mod+((ll)f[i][1][0]*sum[upn][k]%mod+(ll)f[i][1][1]*sum[upn][upm]%mod)%mod)%mod;
		}
		for(int i=0;i<2;++i)for(int j=0;j<2;++j)ans=(ans-f[0][i][j]+mod)%mod;
		printf("%d\n",ans);
	}
	return 0;
}

2018.10.31 bzoj4737: 组合数问题(lucas定理+容斥原理+数位dp)的更多相关文章

  1. 【NOI2019模拟2019.6.29】组合数(Lucas定理、数位dp)

    Description: p<=10且p是质数,n<=7,l,r<=1e18 题解: Lucas定理: \(C_{n}^m=C_{n~mod~p}^{m~mod~p}*C_{n/p} ...

  2. 2018.10.31 NOIP模拟 几串字符(数位dp+组合数学)

    传送门 如果观察到性质其实也不是很难想. 然而考试的时候慌得一批只有心思写暴力233. 下面是几个很有用的性质: c0,1+1≥c1,0≥c0,1c_{0,1 }+1 ≥ c_{1,0} ≥ c_{0 ...

  3. 2018.10.27 bzoj3209: 花神的数论题(数位dp)

    传送门 数位dpdpdp经典题. 题面已经暗示了我们按照二进制位来数位dpdpdp. 直接dpdpdp多少个数有111个111,222个111,333个111-, 然后快速幂算就行了. 于是我们枚举前 ...

  4. [UOJ 275/BZOJ4737] 【清华集训2016】组合数问题 (LUCAS定理的运用+数位DP)

    题面 传送门:UOJ Solution 这题的数位DP好蛋疼啊qwq 好吧,我们说回正题. 首先,我们先回忆一下LUCAS定理: \(C_n^m \equiv C_{n/p}^{m/p} \times ...

  5. 【算法学习笔记】组合数与 Lucas 定理

    卢卡斯定理是一个与组合数有关的数论定理,在算法竞赛中用于求组合数对某质数的模. 第一部分是博主的个人理解,第二部分为 Pecco 学长的介绍 第一部分 一般情况下,我们计算大组合数取模问题是用递推公式 ...

  6. 大组合数:Lucas定理

    最近碰到一题,问你求mod (p1*p2*p3*……*pl) ,其中n和m数据范围是1~1e18 , l ≤10 , pi ≤ 1e5为不同的质数,并保证M=p1*p2*p3*……*pl ≤ 1e18 ...

  7. [文章汇总]ASP.NET Core框架揭秘[最近更新:2018/10/31]

    之前一段时间都在个人公众号账号“大内老A”发布关于ASP.NET Core的系列文章,很多人留言希望能够同步到这里,所以在这里 对这些文章做一个汇总,以便于PC端阅读.如果说微软官方文档主要关于ASP ...

  8. 2018.09.14 bzoj2982: combination(Lucas定理)

    传送门 貌似就是lucas的板子题啊. 练一练手感觉挺舒服的^_^ 代码: #include<bits/stdc++.h> #define mod 10007 #define ll lon ...

  9. it's time to change myself now (2018.10.31)

    自16年从新屋熊职校毕业,入职深圳某厂从事云存储两年半了.两年半的时间很快,快的感觉一生都会飞快,两年多一直很忙,忙的几乎忘了自己是否正向改变过. 正向改变,or 积极改变,今年十一回家,与几个好友小 ...

随机推荐

  1. 在别家网站上执行自己的js代码(谷歌浏览器)(谷歌扩展程序)

    @参考文章1  @参考文章2 日前针对一家投标网站进行了程序干预,且一定程度的干预成功,把方法给大家提取分享出来,感谢上述两篇博文 测试网站:百度https://www.baidu.com/ 测试步骤 ...

  2. mysql 索引 create_time 加explain关键字是否走索引

    SELECT * FROM t_user WHERE email='217@xxg.com';  --1.725 --加email索引之后 0.003 SELECT * FROM t_user WHE ...

  3. swift - 添加定时器

    mport UIKit /// 控制定时器的类 class ZDTimerTool: NSObject { /// 定时器 // private var timer: Timer? /// GCD定时 ...

  4. java 线程Thread 技术--1.5 Future与Callable

    Callable: 从官方文档说起: 通过实现callable 的called 方法可以使一个任务可以返回一个结果以及可能抛出一个异常: callable 与runnable 是相似的,可以被其他线程 ...

  5. 【 python】输出随机的字符或数字

    随机输出0-9的数字 from random import choice x = choice([0,1,2,3,4,5,6,7,8,9]) print x 输出结果 #python first.py ...

  6. Js学习(1)基本语法

    变量: 用var声明变量,如果只是声明变量而不赋值,则变量的值是undefined,表示无定义 不写·var也有效,但不建议 变量声明两次无效,但第二次声明时赋值会覆盖掉前面的值 变量提升: Js引擎 ...

  7. DOS下的安全空间

    我们需要直接向一段内存中写入内容: 这段内存空间不应存放系统或其他程序的数据或代码,否则写入操作很可能引发错误: DOS方式下,一般情况,0:200~0:2ff空间中没有系统或其他程序的数据或代码; ...

  8. Linux_(4)Shell编程(下)

    五.shell流程控制1.一重分支if 语句语法格式:if condition then command1 fi末尾的fi就是if倒过来. 写成一行: if condition; then comma ...

  9. socket网络编程扫盲篇

    socket 是“套接字”的意思,是计算机之间进行通信的一种约定,也可以认为是一种技术.通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据. socket 的 ...

  10. Oracle的SQL语句中如何处理‘&’符号

    ‘&’符号在SQL中有特殊含义,所以在SQL中想要写入&,需要特殊处理. 如下SQL语句就不能正确运行: SQL> select 'a&b' from dual; 处理方 ...