CF582D Number of Binominal Coefficients 库默尔定理 数位dp
LINK:Number of Binominal Coefficients
原来难题都长这样。。
水平有限只能推到一半。
设\(f(x)\)表示x中所含p的最大次数。即x质因数分解之后 p的指标。
容易想到 \(f(n!)=\sum_{i=1}^{n}\frac{n}{p^i}\)
也同时 题目其实是想让我们求出 \(f(n!)-f(k!)-f((n-k)!)>=a\)的数对(n,k)的个数。
需要再转换一下 可以得到\(f(x)\)x质因数分解之后扔掉第一位的数字大小。
\(f(n!)\)其实是 不断扔掉一位 数字大小的累加。
但是我们需要求出\(f(C(n,k))\) 这里可以自己硬猜 不过存在一个库默尔定理。
\(f(C(n,k))\)其实是 \(f(n!)-f(k!)-(n-k)!\)也即 k和n-k在p进制下进位的次数。
这里给出简单证明:如果不存在进位 那么显然 这个东西就是为0.
如果某一位存在进位 那么在统计当前位的时候没有影响 统计下一位的贡献时 \(f(n!)\)会多1.
显然当前的进位只会对下一位有贡献1。
也就是每次进位都是n!比k!+(n-k)!多1的时候 所以\(f(C(n,k))\)即 k和n-k在p进制下进位的次数。
至此 可以发现需要解决的问题变成了 有多少个数对(n,k) 在p进制下进位次数>=a 当然\(n+k\leq lim\)
剩下的 就是一个数位dp的模型了 不过有点难写。
大体上 设状态 f[i][j][0/1][0/1]表示最高位~当前位 有j次进位 且是否存在最高位限制 且是否有下一位的进位。
值得一提的是需要保留下一位是否进位 而并非当前位 因为下一位对当前有影响 且一下位也同时影响着 当前位是否满足限制。
记忆化搜索就不大行了 常数大了 这个状态被定义出来就是接近1e7的。
显然递推需要从 左到右推 转移比较难写 注意要认真。
这可真是 从头到尾都是一道难题该有的样子。
const int MAXN=3510;
int n,m,p,a;
int f[MAXN][MAXN][2][2];//f[i][j][k][l]表示n~i+1位进了j次位了有没有最高位的限制是否存对上一次的进位.
char c[MAXN];
int cc[MAXN],b[MAXN];
int main()
{
freopen("1.in","r",stdin);
gt(p);gt(a);gc(c);
m=strlen(c+1);
reverse(c+1,c+1+m);
rep(1,m,i)cc[i]=c[i]-'0';
while(m)
{
ll cnt=0;
fep(m,1,i)
{
cnt=cnt*10+cc[i];
cc[i]=cnt/p;cnt%=p;
}
if(!cc[m]&&m>=1)--m;
b[++n]=cnt;
}
if(a>n-1){puts("0");return 0;}
f[n+1][0][1][0]=1;
fep(n,1,i)
{
int c0=(ll)(1+p)*p/2%mod;//定义域为[0,p-1]值域为[0,p-1].
int c1=(ll)(b[i]+1)*b[i]/2%mod;//定义域为[a+b<=bi-1] 值域为[0,bi-1].
int c2=(ll)(p-1)*p/2%mod;//定义域为[0,p-1] 值域为[p,2p-2]
int c3=(ll)b[i]*(2*p-b[i]-1)/2%mod;//定义域为[a+b<=p+bi-1] 值域[p,p+bi-1]
int c4=(ll)(b[i]-1)*b[i]/2%mod;
int c5=(ll)(2*p-b[i]+1)*b[i]/2%mod;
rep(0,n-i,j)
{
int f0=f[i+1][j][0][0],f1=f[i+1][j][1][0];
int f2=f[i+1][j][0][1],f3=f[i+1][j][1][1];
f[i][j][0][0]=((ll)f0*c0%mod+(ll)c1*f1+(ll)f2*c2%mod+(ll)f3*c3%mod)%mod;
f[i][j][1][0]=((ll)(b[i]+1)*f1%mod+(ll)(p-1-b[i])*f3%mod)%mod;
f[i][j+1][0][1]=((ll)c2*f0%mod+(ll)c4*f1%mod+(ll)c0*f2%mod+(ll)c5*f3%mod)%mod;
f[i][j+1][1][1]=((ll)b[i]*f1%mod+(ll)(p-b[i])*f3%mod)%mod;
}
}
ll ans=0;
rep(a,n,i)
{
ans=(ans+f[1][i][0][0]+f[1][i][1][0])%mod;
//cout<<f[1][i][0][0]<<endl;
}
putl(ans);return 0;
}
CF582D Number of Binominal Coefficients 库默尔定理 数位dp的更多相关文章
- [CSP-S模拟测试]:密码(数位DP+库默尔定理)
题目描述 为了揭穿$SERN$的阴谋,$Itaru$黑进了$SERN$的网络系统.然而,想要完全控制$SERN$,还需要知道管理员密码.$Itaru$从截获的信息中发现,$SERN$的管理员密码是两个 ...
- Codeforces 582D - Number of Binominal Coefficients(Kummer 定理+数位 dp)
Codeforces 题目传送门 & 洛谷题目传送门 一道数论与数位 dp 结合的神题 %%% 首先在做这道题之前你需要知道一个定理:对于质数 \(p\) 及 \(n,k\),最大的满足 \( ...
- hdu 5898 odd-even number 数位DP
传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...
- codeforces Hill Number 数位dp
http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits: 5000 MS Memory Limits: ...
- HDU 5787 K-wolf Number 数位DP
K-wolf Number Problem Description Alice thinks an integer x is a K-wolf number, if every K adjacen ...
- Fzu2109 Mountain Number 数位dp
Accept: 189 Submit: 461Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description One ...
- HDU 3709 Balanced Number (数位DP)
Balanced Number Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- HDU3709 Balanced Number (数位dp)
Balanced Number Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Descript ...
- 多校5 HDU5787 K-wolf Number 数位DP
// 多校5 HDU5787 K-wolf Number 数位DP // dp[pos][a][b][c][d][f] 当前在pos,前四个数分别是a b c d // f 用作标记,当现在枚举的数小 ...
随机推荐
- 线程基础知识01-Thread类,Runnable接口
常见面试题:创建一个线程的常用方法有哪些?Thread创建线程和Runnable创建线程有什么区别? 答案通常集中在,继承类和实现接口的差别上面: 如果深入问一些问题:1.要执行的任务写在run()方 ...
- P3295 萌萌哒 题解
题目 一个长度为n的大数,用\(S_1,S_2,S_3...S_n\)表示,其中\(S_i\)表示数的第\(i\)位,\(S_1\)是数的最高位,告诉你一些限制条件,每个条 件表示为四个数,\(l_1 ...
- C#获取页面内容的几种方式
常见的Web页面获取页面内容用 WebRequest 或者 HttpWebRequest 来操作 Http 请求. 例如,获取百度网站的 html 页面 var request = WebReques ...
- python 魔法方法总结
目录 一.__str__ 二.__repr__ 三.__format__ 四.__del__ 五.__dict__和__slots__ 六.__item__.__attr__系列 七.__init__ ...
- alert(1) to win Part Ⅰ
alert(1) to win Adobe: function escape(s) { s = s.replace(/"/g, '\\"'); return '<script ...
- 数据可视化之DAX篇(二十六)Power BI度量值:滚动聚合
https://zhuanlan.zhihu.com/p/85996745 上一篇文讲了累计聚合,这篇文章继续讲一下滚动聚合,比如常用的MAT计算,Moving Annual Total,滚动年度总计 ...
- 深度剖析分布式单点登录框架XXL-SSO
于2018年初,在github上创建XXL-SSO项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计-- 于2018年初,在github上创建XXL-SSO项目仓库并提交第一个 ...
- Unity3D+Post Processing Stack V2自定义后处理效果研究
背景 众所周知,Unity3D支持自定义后处理效果,实现过程有三步: 添加着色器,在着色器里书写后处理代码: 添加材质,把材质和着色器绑定: 给相机添加脚本,重写其OnRenderImage方法,将材 ...
- Guava集合--新集合类型
Guava引入了很多JDK没有的.但我们发现明显有用的新集合类型.这些新类型是为了和JDK集合框架共存,而没有往JDK集合抽象中硬塞其他概念.作为一般规则,Guava集合非常精准地遵循了JDK接口契约 ...
- python- generator生成器
什么是生成器? 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后 ...