Codeforces 582D - Number of Binominal Coefficients(Kummer 定理+数位 dp)
一道数论与数位 dp 结合的神题 %%%
首先在做这道题之前你需要知道一个定理:对于质数 \(p\) 及 \(n,k\),最大的满足 \(p^{\alpha}\mid\dbinom{n}{k}\) 的 \(\alpha\) 为 \(k\) 与 \(n-k\) 在 \(p\) 进制下相加的进位次数。证明就考虑扩展 Lucas 定理,记 \(f(x)\) 为最大的满足 \(p^{\alpha}\mid x\) 的 \(\alpha\),那么由 \(\dbinom{n}{k}=\dfrac{n!}{k!(n-k)!}\) 可知 \(f(\dbinom{n}{k})=f(n!)-f(k!)-f((n-k)!)\),我们考虑将 \(k,n-k\) 都在 \(k\) 进制下表示,我们设它们从高到低分别是 \(k=(a_{m-1}a_{m-2}\cdots a_1a_0)_p,n-k=(b_{m-1}b_{m-2}\cdots b_1b_0)_p,n=(c_{m-1}c_{m-2}\cdots c_1c_0)_p\)(在这里,我们不妨假设 \(n<p^m\),即 \(n+k\) 在 \(p^m\) 位不会产生进位),那么根据扩展 Lucas 定理 \(f(k!)\) 应当为 \(\sum\limits_{i=1}^{m-1}(a_{m-1}a_{m-2}\cdots a_i)_p\),即 \(k\) 在 \(p\) 进制表示下所有前缀(不包括本身)表示的数之和。很显然的一点是对于任意 \(i\in[1,m-1]\),\((a_{m-1}a_{m-2}\cdots a_i)_p+(b_{m-1}b_{m-2}\cdots b_i)_p\le(c_{m-1}c_{m-2}\cdots c_i)_p\),那么什么时候 \((a_{m-1}a_{m-2}\cdots a_i)_p+(b_{m-1}b_{m-2}\cdots b_i)_p<(c_{m-1}c_{m-2}\cdots c_i)_p\) 呢?显然如果前面没有进位那就不可能存在这种情况,否则,由于只有两数相加,因此最多进上来一位,而进上来一位以后显然就有 \((a_{m-1}a_{m-2}\cdots a_i)_p+(b_{m-1}b_{m-2}\cdots b_i)_p+1=(c_{m-1}c_{m-2}\cdots c_i)_p\),会对答案产生 \(1\) 的贡献,因此该结论成立。据说该结论有一个名字叫什么库默尔(Kummer)定理,不过名字啥的不重要啦((
知道这个结论之和就可以数位 dp 了。题目中 \(\alpha\le 10^9\) 是假的,如果 \(\alpha>\log_pA\) 那答案显然为 \(0\)。我们首先将题目给出的那个数用 \(p\) 进制表示,我们设 \(dp_{i,j,0/1,0/1}\) 表示考虑了最高的 \(i\) 位,当前进位了 \(j\) 次,上一位(第 \(i+1\) 高的位)是否产生进位,当前是否达到上界,考虑转移,假设 \(A\) 的第 \(i+1\) 位的值为 \(c\),我们要决策 \(k\) 的第 \(i+1\) 位的值 \(a\) 与 \(n-k\) 的第 \(i+1\) 位的值 \(b\),那么有转移:
- \(dp_{i+1,j,0,0}\):
- 如果从 \(dp_{i,j,0,0}\) 转移来那么需满足 \(a+b<p\),方案数 \(\dfrac{p(p+1)}{2}\)
- 如果从 \(dp_{i,j,0,1}\) 转移来那么需满足 \(a+b<c\),方案数 \(\dfrac{c(c+1)}{2}\)
- 如果从 \(dp_{i,j,1,0}\) 转移来那么需满足 \(a+b\ge p\),方案数 \(\dfrac{p(p-1)}{2}\)
- 如果从 \(dp_{i,j,1,1}\) 转移来那么需满足 \(p\le a+b<p+c\),方案数 \(\dfrac{(p+c)(p+c+1)}{2}-\dfrac{p(p+1)}{2}=\dfrac{c(2n-c-1)}{2}\)
- \(dp_{i+1,j,0,1}\):
- 如果从 \(dp_{i,j,0,1}\) 转移来那么需满足 \(a+b=c\),方案数 \(c+1\)
- 如果从 \(dp_{i,j,1,1}\) 转移来那么需满足 \(a+b=p+c\),方案数 \(p-c-1\)
- \(dp_{i+1,j,1,0}\):
- 如果从 \(dp_{i,j,0,0}\) 转移来那么需满足 \(a+b<p-1\),方案数 \(\dfrac{p(p-1)}{2}\)
- 如果从 \(dp_{i,j,0,1}\) 转移来那么需满足 \(a+b<c-1\),方案数 \(\dfrac{c(c-1)}{2}\)
- 如果从 \(dp_{i,j,1,0}\) 转移来那么需满足 \(a+b\ge p-1\),方案数 \(\dfrac{p(p+1)}{2}\)
- 如果从 \(dp_{i,j,1,1}\) 转移来那么需满足 \(p\le a+b+1<p+c\),方案数 \(\dfrac{(p+c)(p+c-1)}{2}-\dfrac{p(p-1)}{2}=\dfrac{c(2n-c+1)}{2}\)
- \(dp_{i+1,j,1,1}\):
- 如果从 \(dp_{i,j,0,1}\) 转移来那么需满足 \(a+b+1=c\),方案数 \(c\)
- 如果从 \(dp_{i,j,1,1}\) 转移来那么需满足 \(a+b+1=p+c\),方案数 \(p-c\)
算下贡献转移一下即可。时间复杂度 \(\mathcal O(\log^2_kA)\)。
最好使用滚动数组优化。
const int MAXL=4000;
const int MOD=1e9+7;
int n,alpha,len,m=0,a[MAXL+5],x[MAXL+5];
char A[MAXL+5];int dp[2][MAXL+5][2][2];
int main(){
scanf("%d%d%s",&n,&alpha,A+1);len=strlen(A+1);
if(alpha>MAXL) return puts("0"),0;
for(int i=1;i<=len;i++) a[len-i+1]=A[i]-'0';
while(len){
ll cur=0;
for(int i=len;i;i--){
cur=cur*10+a[i];a[i]=cur/n;cur%=n;
} x[++m]=cur;if(!a[len]) len--;
} int cur=1,pre=0;
dp[cur][0][0][1]=1;
for(int i=m;i;i--){
cur^=pre^=cur^=pre;
memset(dp[cur],0,sizeof(dp[cur]));
int c1=1ll*(n+1)*n/2%MOD;
int c2=1ll*(x[i]+1)*x[i]/2%MOD;
int c3=1ll*(n-1)*n/2%MOD;
int c4=1ll*x[i]*(n*2-x[i]-1)/2%MOD;
int c5=1ll*(x[i]-1)*x[i]/2%MOD;
int c6=1ll*x[i]*(n*2-x[i]+1)/2%MOD;
for(int j=0;j<=m-i+1;j++){
int f0=dp[pre][j][0][0],f1=dp[pre][j][0][1];
int f2=dp[pre][j][1][0],f3=dp[pre][j][1][1];
dp[cur][j][0][0]=(1ll*f0*c1+1ll*f1*c2+1ll*f2*c3+1ll*f3*c4)%MOD;
dp[cur][j][0][1]=(1ll*(x[i]+1)*f1+1ll*(n-x[i]-1)*f3)%MOD;
dp[cur][j+1][1][0]=(1ll*f0*c3+1ll*f1*c5+1ll*f2*c1+1ll*f3*c6)%MOD;
dp[cur][j+1][1][1]=(1ll*x[i]*f1+1ll*(n-x[i])*f3)%MOD;
}
} int ans=0;
for(int i=alpha;i<=m;i++){
ans=(ans+dp[cur][i][0][0])%MOD;
ans=(ans+dp[cur][i][0][1])%MOD;
} printf("%d\n",ans);
return 0;
}
Codeforces 582D - Number of Binominal Coefficients(Kummer 定理+数位 dp)的更多相关文章
- CF582D Number of Binominal Coefficients 库默尔定理 数位dp
LINK:Number of Binominal Coefficients 原来难题都长这样.. 水平有限只能推到一半. 设\(f(x)\)表示x中所含p的最大次数.即x质因数分解之后 p的指标. 容 ...
- uoj86 mx的组合数 (lucas定理+数位dp+原根与指标+NTT)
uoj86 mx的组合数 (lucas定理+数位dp+原根与指标+NTT) uoj 题目描述自己看去吧( 题解时间 首先看到 $ p $ 这么小还是质数,第一时间想到 $ lucas $ 定理. 注意 ...
- bzoj 1902: Zju2116 Christopher lucas定理 && 数位DP
1902: Zju2116 Christopher Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 172 Solved: 67[Submit][Stat ...
- Codeforces Beta Round #51 D. Beautiful numbers(数位dp)
题目链接:https://codeforces.com/contest/55/problem/D 题目大意:给你一段区间[l,r],要求这段区间中可以整除自己每一位(除0意外)上的数字的整数个数,例如 ...
- 【XSY2691】中关村 卢卡斯定理 数位DP
题目描述 在一个\(k\)维空间中,每个整点被黑白染色.对于一个坐标为\((x_1,x_2,\ldots,x_k)\)的点,他的颜色我们通过如下方式计算: 如果存在一维坐标是\(0\),则颜色是黑色. ...
- BZOJ4737 组合数问题(卢卡斯定理+数位dp)
不妨不管j<=i的限制.由卢卡斯定理,C(i,j) mod k=0相当于k进制下存在某位上j大于i.容易想到数位dp,即设f[x][0/1][0/1][0/1]为到第x位时是否有某位上j> ...
- BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)
注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积.对于k的限制容易想到数位dp.可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡 ...
- codeforces 597div2 F. Daniel and Spring Cleaning(数位dp+二维容斥)
题目链接:https://codeforces.com/contest/1245/problem/F 题意:给定一个区间(L,R),a.b两个数都是属于区间内的数,求满足 a + b = a ^ b ...
- Codeforces 914C Travelling Salesman and Special Numbers:数位dp
题目链接:http://codeforces.com/problemset/problem/914/C 题意: 对数字x进行一次操作,可以将数字x变为x在二进制下1的个数. 显然,一个正整数在进行了若 ...
随机推荐
- Servlet学习一(Servlet的使用流程)
一.servlet运行流程 运行流程:浏览器发送请求到服务器,服务器根据url地址在webapps中寻找对应的项目文件夹然后再web.xml中检索对应的servlet,并进行调用二.servlet类写 ...
- 技术博客--微信小程序canvas实现图片编辑
技术博客--微信小程序canvas实现图片编辑 我们的这个小程序不仅仅是想给用户提供一个保存和查找的平台,还希望能给用户一个展示自己创意的舞台,因此我们实现了图片的编辑部分.我们对对图片的编辑集成了很 ...
- [对对子队]团队任务拆解Alpha
Alpha阶段主要目标 完成游戏场景的基本实现(不要求美术资源) 完成游戏UI的基本实现(不要求美术资源) 制作第一部分的关卡(顺序语句,制作3-5关) 完成第一部分关卡和游戏基本逻辑的测试 任务分解 ...
- oo第一次博客-三次表达式求导的总结与反思
一.问题回顾与基本设计思路 三次作业依次是多项式表达式求导,多项式.三角函数混合求导,基于三角函数和多项式的嵌套表达式求导. 第一次作业想法很简单,根据指导书,我们可以发现表达式是由各个项与项之间的运 ...
- 关于qmake的install
在pro的构建系统中可以设置INSTALLS变量,在make命令之后,执行make install命令触发,将想要的资源拷贝到相应的目录,参考qwt的构建体系,在qwt.pro末尾有这么几句 qwts ...
- [源码解析] PyTorch 如何实现后向传播 (4)---- 具体算法
[源码解析] PyTorch 如何实现后向传播 (4)---- 具体算法 目录 [源码解析] PyTorch 如何实现后向传播 (4)---- 具体算法 0x00 摘要 0x01 工作线程主体 1.1 ...
- Luogu P1297 [国家集训队]单选错位 | 概率与期望
题目链接 题解: 单独考虑每一道题目对答案的贡献. 设$g_i$表示gx在第$i$道题目的答案是否正确(1表示正确,0表示不正确),则$P(g_i=1)$表示gx在第$i$道题目的答案正确的概率. 我 ...
- 深入了解Mybatis架构设计
架构设计 我们可以把Mybatis的功能架构分为三层: API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库.接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理. ...
- openstack 虚机热迁移问题:虚机状态一直处于迁移中的情况处理
前提:在偶尔的虚机热迁移中,发现虚机一直属于迁移状态中. 但是查看后台流量监控,发现没有流量已经下来了.然后在目标机器上查看,发现kvm已经在目标机器上. 1.查看kvm 实际所处宿主机方法: a.拿 ...
- HDC2021:HMS Core分析服务,数智化营销闭环方案帮助开发者实现精益增长
10.22-10.24华为开发者大会2021(Together)在东莞如期举行.本次大会上,HMS Core华为分析服务作为多平台.跨设备的一站式数据分析平台以数据驱动业务智能决策为理念,带来了数智化 ...