Codeforces 628D 数位dp
题意:d magic number(0<=d<9)的意思就是一个数,从最高位开始奇数位不是d,偶数位是d
题目问,给a,b,m,d(a<=b,m<2000)问,a,b之间有多少个数满足既是d magic number,又可以被m整除
a,b的范围很大,都是2000位,且a,b的位数一样,这一点很重要
分析:这题一看又有取模,又是大整数,那肯定是要用数位dp做,
通常的数位dp,我们要解决(0,x)的区间中的答案,但是这个题不需要,
注意刚才我说过一点,a,b是位数相同的整数,假设solve()函数能解决x到和它同位的最小整数的区间范围内的答案
那么最终答案,就是solve(b)-solve(a)+is(a),
这样我们的工作就简单了,不需要统计位数比它小的数
我们从高位开始进行dp
下面定义状态
1: dp[i][j][1],代表现在处理到第 i 位 且前缀 i 位形成的整数n%m=j 的 方案数,且现在形成的整数等于上限
2: dp[i][j][0],代表现在处理到第 i 位 且前缀 i 位形成的整数n%m=j 的 方案数,且现在形成的整数小于上限
那么状态转移方程就很好想了
设字符串长度为n 那么时间复杂度是O(nm)的
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 2e3+;
const int mod = 1e9+;
int dp[N][N][],num[N],m,d;
char a[N],b[N];
int solve(char *s)
{
int l=strlen(s+);
memset(dp,,sizeof(dp));
for(int i=; i<=l; ++i)
num[i]=s[i]-'';
for(int i=; i<=; ++i)
{
if(i==d)continue;
if(i<num[])++dp[][i%m][];
else if(i==num[])++dp[][i%m][];
}
for(int i=; i<=l; ++i)
{
if(i%==)
{
for(int j=; j<m; ++j)
{
int cur=(j*+d)%m;
dp[i][cur][]=(dp[i][cur][]+dp[i-][j][])%mod;
if(d<num[i])
dp[i][cur][]=(dp[i][cur][]+dp[i-][j][])%mod;
else if(num[i]==d)
dp[i][cur][]=(dp[i][cur][]+dp[i-][j][])%mod;
}
}
else
{
for(int k=; k<; ++k)
{
if(k==d)continue;
for(int j=; j<m; ++j)
{
int cur=(j*+k)%m;
dp[i][cur][]=(dp[i][cur][]+dp[i-][j][])%mod;
if(k<num[i])
dp[i][cur][]=(dp[i][cur][]+dp[i-][j][])%mod;
else if(k==num[i])
dp[i][cur][]=(dp[i][cur][]+dp[i-][j][])%mod;
}
}
}
}
return (dp[l][][]+dp[l][][])%mod;
}
int judge(char *s)
{
int l=strlen(s+),sum=;
for(int i=;i<=l;++i)
{
int x=s[i]-'';
if(i%&&x==d)return ;
if(!(i%)&&x!=d)return ;
sum=(sum*+x)%m;
}
if(!sum)return ;
return ;
}
int main()
{
scanf("%d%d%s%s",&m,&d,a+,b+);
int ans=(solve(b)-solve(a)+judge(a)+mod)%mod;
printf("%d\n",ans);
return ;
}
Codeforces 628D 数位dp的更多相关文章
- Codeforces 55D (数位DP+离散化+数论)
题目链接: http://poj.org/problem?id=2117 题目大意:统计一个范围内数的个数,要求该数能被各位上的数整除.范围2^64. 解题思路: 一开始SB地开了10维数组记录情况. ...
- codeforces 401D (数位DP)
思路:很明显的数位dp,设dp[i][j] 表示选取数字的状态为i,模m等于j的数的个数,那么最后的答案就是dp[(1<<n)-1][0].状态转移方程就是,dp[i|(1<< ...
- Travelling Salesman and Special Numbers CodeForces - 914C (数位dp)
大意: 对于一个数$x$, 每次操作可将$x$变为$x$二进制中1的个数 定义经过k次操作变为1的数为好数, 求$[1,n]$中有多少个好数 注意到n二进制位最大1000位, 经过一次操作后一定变为1 ...
- Codeforces - 914C 数位DP
题意有点难以描述,简略的就是给定一个二进制\(n\),每一步操作能使\(n\)的位为1的数的和转化为一个十进制,然后转化为该数的二进制再进行相同的操作 查询\([0,n]\)中操作数恰好为\(k\)的 ...
- codeforces 55D 数位dp
D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...
- Shovel Sale CodeForces - 899D (数位dp)
大意: n把铲子, 价格1,2,3,...n, 求有多少个二元组(x,y), 满足x+y末尾数字9的个数最多. 枚举最高位, 转化为从[1,n]中选出多少个二元组和为$x$, 枚举较小的数 若$n\g ...
- codeforces Hill Number 数位dp
http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits: 5000 MS Memory Limits: ...
- codeforces 55D - Beautiful numbers(数位DP+离散化)
D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...
- Codeforces Gym 100231L Intervals 数位DP
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description Start with an integer, N0, ...
随机推荐
- Truncating HTML attribute value in SharePoint DataFormWebPart
<xsl:value-ofdisable-output-escaping="yes"select="@Body"/>
- 去除C/C++程序代码中的注释
最近搞软件著作权,去除代码空行和注释比较麻烦,想写个程序自动去除,去网上搜了下,发现有类似的程序,不过只有去除注释.鉴于word中可以去除空行(用^p^p替换^p),先用网上的代码,以后有时间写个完整 ...
- Delphi XE5 如何设计并使用FireMonkeyStyle(转)
如何设计并使用FireMonkeyStyle FireMonkey使用Style来控制控件的显示方式. 每个控件都有一个StyleLookup属性,FireMonkey就是通过控件的这个属性来在当前窗 ...
- 1024: [SCOI2009]生日快乐 - BZOJ
Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕.现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋 ...
- Mybatis 一对一、一对多、多对多关联之级联添加
示例项目:MIPO_CRM 一.一对一关联 示例:订单与销售机会 描述:在业务员与客户的联系人的联系记录中可以生成一条销售机会,而此条销售机会可生成一条订单,两者呈一对一关联. 1.表设计 oppor ...
- js 全选 反选
1.全选 function selectAll(form){ for (var i = 0; i < form.elements.length; i++) { if (form.elements ...
- 用 OneAPM Cloud Insight 监控 Docker 性能
Docker 是构建和部署软件的一个新兴的轻量级的平台,也是一个减轻替代虚拟机的容器.Docker 通过给开发者提供兼容不同环境的镜像,成为解决现代基础设施的持续交付的一个流行的解决方案. 和虚拟机一 ...
- tomcat 设置默认编码格式
在tomcat目录下 conf文件夹下的server.xml中: <Connector port="80" protocol="HTTP/1.1" ...
- 李洪强iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)
iOS开发拓展篇—UIDynamic(重力行为+碰撞检测) 一.重力行为 说明:给定重力方向.加速度,让物体朝着重力方向掉落 1.方法 (1)UIGravityBehavior的初始化 - (inst ...
- [itint5]堆放积木
先按照一维排序,然后在第二维求最大上升子序列.注意比较的时候还要考虑第一维虽然排序,还是有可能相等的. bool comp(const Box &a, const Box &b) { ...