Kummer定理-超级Lucas定理-数论-组合数学-学习笔记
做寒假作业时发现自己啥都不会...
Kummer定理
设m,n为正整数,p为素数,则
证明:
来一道题:求
我们用总数减去不符合规定的数量:进位0次或1次的。我们可以枚举进位的位置。
一道类似的题,求9的倍数:
例题:CF582D
好恶心啊...不想写
题意:
给出一个质数 p 和一个数 a,和一个大整数 A,求有多少对 n、m 满足 0≤m≤n≤A,且
也就是
我们可以数位DP来求(我们DP的是
设
转移的话,系数是一个等差数列,写几个找找规律即可。
il int calcS(int n,int up,int ex)
{
if(!up) return sub((LL)(n+2)*(n+1)/2%md,ex*(n+1));
else return add((LL)(p-1+p-1-n)*(n+1)/2%md,ex*(n+1));
}
il int calcP(int n,int up,int ex)
{
if(!up) return n+1-ex;
else return p-1-n+ex;
}
f[0][0][0][1]=1;
for(ri i=1; i<=n; ++i)
for(ri j=0; j<=a; ++j)
for(ri k=0; k<=1; ++k)
for(ri eq=0; eq<=1; ++eq)
{
int t=f[i-1][j][k][eq];
if(!t) continue;
for(ri up=0; up<=1; ++up)
{
int nj=min(j+up,a);
if(!eq) inc(f[i][nj][up][0],mul(t,calcS(p-1,k,up)));
else
{
inc(f[i][nj][up][1],mul(t,calcP(A[i],k,up)));
if(A[i]) inc(f[i][nj][up][0],mul(t,calcS(A[i]-1,k,up)));
}
}
}