【UOJ#275】组合数问题(卢卡斯定理,动态规划)
【UOJ#275】组合数问题(卢卡斯定理,动态规划)
题面
题解
数据范围很大,并且涉及的是求值,没法用矩阵乘法考虑。
发现\(k\)的限制是,\(k\)是一个质数,那么在大组合数模小质数的情况下可以考虑使用卢卡斯定理。
卢卡斯定理写出来是\(Lucas(n,m)=Lucas(n/K,m/K)*Lucas(n\%K,m\%K)\)
显然只要有任何一个\(Lucas(n\%K,m\%K)=C_{n\%K}^{m\%K}\)是\(K\)的倍数那么当前数就会是\(K\)的倍数。因为\(K\)是质数,并且组合数的上下都小于\(K\),因此这个值是\(K\)的倍数的时候,当且仅当\(m\%K>n\%K\)。那么整个式子我们理解为,把\(n,m\)按照\(K\)进制分解,当且仅当存在至少一位上有\(m\)的这一位大于\(n\)的这一位成立。分解为\(K\)进制之后最多\(logn\)大概是\(60\)位,可以大力考虑\(dp\)。
设\(f[i][0/1][0/1][0/1][0/1]\)表示当且考虑到了第\(i\)位,第一个数是否卡在上界\(n\),第二个数是否卡在上界\(m\),第二个数是否卡在上界第一个数,前面是否至少已经存在一位满足第二个数大于第一个数了。这样子\(dp\)好复杂,我们用总方案减去不合法的,设\(f[i][0/1][0/1]\)表示当且是否卡在边界上,强制没有任何一位满足第二个数大于第一个数。总数很好算,减一下就好了。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MOD 1000000007
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
long long n,m;int T,K,f[65][2][2],sn[65],tn,sm[65],tm,ans;
int main()
{
cin>>T>>K;
while(T--)
{
cin>>n>>m;m=min(n,m);tn=tm=0;
ans=(((1+m)%MOD)*(m%MOD)%MOD*500000004%MOD+((n-m+1)%MOD)*((m+1)%MOD)%MOD)%MOD;
for(;n;n/=K,m/=K)sn[++tn]=n%K,sm[++tm]=m%K;
memset(f,0,sizeof(f));f[tn+1][1][1]=1;
for(int i=tn;i;--i)
for(int j=0;j<2;++j)
for(int k=0;k<2;++k)
if(f[i+1][j][k])
for(int x=0;x<=(j?sn[i]:K-1);++x)
for(int y=0;y<=(k?sm[i]:K-1)&&y<=x;++y)
add(f[i][j&(x==sn[i])][k&(y==sm[i])],f[i+1][j][k]);
for(int i=0;i<2;++i)
for(int j=0;j<2;++j)
add(ans,MOD-f[1][i][j]);
printf("%d\n",ans);
}
return 0;
}
【UOJ#275】组合数问题(卢卡斯定理,动态规划)的更多相关文章
- 【BZOJ4903】【UOJ#300】吉夫特(卢卡斯定理,动态规划)
[BZOJ4903][UOJ#300]吉夫特(卢卡斯定理,动态规划) 题面 UOJ BZOJ:给的UOJ的链接...... 题解 首先模的质数更小了,直接给定了\(2\).当然是卢卡斯定理了啊. 考虑 ...
- UOJ 275. 【清华集训2016】组合数问题
UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...
- 51nod 1120 机器人走方格 V3 【卡特兰数+卢卡斯定理+组合数】
-我并不知道为什么事卡特兰数,反正用dp打的表就是卡特兰数,因为是两个三角所以再乘个2 卡特兰数使用\( h(n)=\frac{C_{2n}^{n}}{n+1} \)因为范围比较大所以组合数部分用卢卡 ...
- 【2019.8.15 慈溪模拟赛 T2】组合数(binom)(卢卡斯定理+高维前缀和)
卢卡斯定理 题目中说到\(p\)是质数. 而此时要求组合数向质数取模的结果,就可以用卢卡斯定理: \[C_x^y=C_{x\ div\ p}^{y\ div\ p}\cdot C_{x\ mod\ p ...
- 数论篇7——组合数 & 卢卡斯定理(Lucas)
组合数 组合数就是高中排列组合的知识,求解组合数C(n,m),即从n个相同物品中取出m个的方案数. 求解方式 求解通式:$C^{m}_{n}=\dfrac {n!}{m!\left( n-m\righ ...
- UOJ#275. 【清华集训2016】组合数问题 数位dp
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ275.html 题解 用卢卡斯定理转化成一个 k 进制意义下的数位 dp 即可. 算答案的时候补集转化一下 ...
- BZOJ4737 组合数问题(卢卡斯定理+数位dp)
不妨不管j<=i的限制.由卢卡斯定理,C(i,j) mod k=0相当于k进制下存在某位上j大于i.容易想到数位dp,即设f[x][0/1][0/1][0/1]为到第x位时是否有某位上j> ...
- 【Luogu3807】【模板】卢卡斯定理(数论)
题目描述 给定\(n,m,p(1≤n,m,p≤10^5)\) 求 \(C_{n+m}^m mod p\) 保证\(P\)为\(prime\) \(C\)表示组合数. 一个测试点内包含多组数据. 输入输 ...
- 【数论】卢卡斯定理模板 洛谷P3807
[数论]卢卡斯定理模板 洛谷P3807 >>>>题目 [题目] https://www.luogu.org/problemnew/show/P3807 [输入格式] 第一行一个 ...
随机推荐
- springboot 发送邮件+模板+附件
package com.example.demo; import org.junit.Test;import org.junit.runner.RunWith;import org.springfra ...
- Codeforces 996E Leaving the Bar (随机化)
题目连接:Leaving the Bar 题意:给你n个向量,你可以加这个向量或减这个向量,使得这些向量之和的长度小于1.5e6. 题解: 按照正常的贪心方法,最后的结果有可能大于1.5e6 .这里我 ...
- 如何使用chrome浏览器进行js调试找出元素绑定的点击事件
大家有没有遇到这样的一个问题,我们在分析一些大型电子商务平台的Web前端脚本时,想找到一个元素绑定的点击事件,并不是那么容易,因为有些前端脚本封装的比较隐蔽,甚至有些加密脚本,用传统的查找元素ID.或 ...
- 常见 Bash 内置变量介绍
目录 $0$1, $2 等等$#$* 与 "$*"$@ 与 "$@"$!$_$$$PPID$?$BASH$BASH_VERSION$EUID 与 $UID$GR ...
- C/C++中int128的那点事
最近群友对int128这个东西讨论的热火朝天的.讲道理的话,编译器的gcc是不支持__int128这种数据类型的,比如在codeblocks 16.01/Dev C++是无法编译的,但是提交到大部分O ...
- easyui datagrid remoteSort的实现 Controllers编写动态的Lambda表达式 IQueryable OrderBy扩展
EF 结合easy-ui datagrid 实现页面端排序 EF动态编写排序Lambda表达式 1.前端页面 var mainListHeight = $(window).height() - 20; ...
- python升级后带来的几个小问题
1)python升级带来的yum异常:File "/usr/bin/yum", line 30 原因:这是因为yum采用Python作为命令解释器,这可以从/usr/bin/yum ...
- 浅谈JS的作用域链(二)
上一篇文章中介绍了Execution Context中的三个重要部分:VO/AO,scope chain和this,并详细的介绍了VO/AO在JavaScript代码执行中的表现. 本文就看看Exec ...
- Linux内核分析 第七周 可执行程序的装载
张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核分析 第七 ...
- POI (Apache POI)
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 基本功能 编辑 结构: HSSF - 提供读写Mi ...