传送门

这是一道让我重新认识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. 微信小程序开发——小程序分享转发

    关于小程序的转发: 最简单的就是点击小程序右上角菜单“转发”按钮直接分享,不过这种分享有点不太友好,实用性也不强. 当然,你可以自定义分享内容,包括标题,简介,图片及分享的小程序页面路径. 再高级一点 ...

  2. 如何从应用直接跳转AppStore 电话 短信 邮件

    //如何从应用直接跳转AppStore [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"应用程序的下载链接& ...

  3. LRU缓存原理

    LRU(Least Recently Used)  LRU是近期最少使用的算法,它的核心思想是当缓存满时,会优先淘汰那些近期最少使用的缓存对象. 采用LRU算法的缓存有两种:LrhCache和DisL ...

  4. android显示通知栏Notification以及自定义Notification的View

    遇到的最大的问题是监听不到用户清除通知栏的广播.所以是不能监听到的. 自定义通知栏的View,然后service运行时更改notification的信息. /** * Show a notificat ...

  5. redis.conf配置详解(转)

    # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位,# 通常的格式就是 1k 5gb 4m 等酱紫:## 1k => 1000 bytes# 1kb =&g ...

  6. ubuntu下安装php

    一.下载PHP7的最新版源码 php7.0.9 下载地址 http://php.net/get/php-7.0.9.tar.gz/from/a/mirror 二.解压 tar -zxf /tmp/ph ...

  7. JQuery UI之Autocomplete(1)入门程序

    1.Autocomplete的主要属性:source:即为指定智能提示下拉框中的数据来源,支持三种类型.  Array,主要用于本地化数据提供,支持两种格式:字符串数组 [ "Choice1 ...

  8. JDBC的学习

    JDBC —— 用Java访问数据库 一.需要用到第三方类:mysql-connector-java-5.0.8-bin.jar,并做好导包处理: 二.初始化驱动: 三.建立与数据库的链接: 四.创建 ...

  9. bootstrap 折叠collapse失效

    手动点击折叠,然后调用折叠全部以后,在手动点击折叠项,折叠失效. 方法,折叠项是通过添加或删除".in"来实现,实现如下 $(".collapse.in").c ...

  10. js 逻辑运算符

    两个逻辑运算符的操作顺序在自己的脑海里一直理不清,用js做了个实验 <script type="text/javascript">    if(false && ...