题意: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的更多相关文章

  1. Codeforces 55D (数位DP+离散化+数论)

    题目链接: http://poj.org/problem?id=2117 题目大意:统计一个范围内数的个数,要求该数能被各位上的数整除.范围2^64. 解题思路: 一开始SB地开了10维数组记录情况. ...

  2. codeforces 401D (数位DP)

    思路:很明显的数位dp,设dp[i][j] 表示选取数字的状态为i,模m等于j的数的个数,那么最后的答案就是dp[(1<<n)-1][0].状态转移方程就是,dp[i|(1<< ...

  3. Travelling Salesman and Special Numbers CodeForces - 914C (数位dp)

    大意: 对于一个数$x$, 每次操作可将$x$变为$x$二进制中1的个数 定义经过k次操作变为1的数为好数, 求$[1,n]$中有多少个好数 注意到n二进制位最大1000位, 经过一次操作后一定变为1 ...

  4. Codeforces - 914C 数位DP

    题意有点难以描述,简略的就是给定一个二进制\(n\),每一步操作能使\(n\)的位为1的数的和转化为一个十进制,然后转化为该数的二进制再进行相同的操作 查询\([0,n]\)中操作数恰好为\(k\)的 ...

  5. codeforces 55D 数位dp

    D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  6. Shovel Sale CodeForces - 899D (数位dp)

    大意: n把铲子, 价格1,2,3,...n, 求有多少个二元组(x,y), 满足x+y末尾数字9的个数最多. 枚举最高位, 转化为从[1,n]中选出多少个二元组和为$x$, 枚举较小的数 若$n\g ...

  7. codeforces Hill Number 数位dp

    http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits:  5000 MS   Memory Limits: ...

  8. codeforces 55D - Beautiful numbers(数位DP+离散化)

    D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  9. Codeforces Gym 100231L Intervals 数位DP

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description Start with an integer, N0, ...

随机推荐

  1. Guide to Database Migration from Microsoft SQL Server using MySQL Workbench

    http://mysqlworkbench.org/2012/07/migrating-from-ms-sql-server-to-mysql-using-workbench-migration-wi ...

  2. poj 1679 The Unique MST(唯一的最小生成树)

    http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submis ...

  3. Linux的安装 CentOS-7.1

    说明: 首先,版本:7.1版:CentOS-7-x86_64-Everything-1503-01.iso 下载自:http://mirrors.163.com/centos/7/isos/x86_6 ...

  4. 在openwrt上初体验PostgreSQL数据库

    要求 请确保在你的路由器shell 中有以下这些命令 adduser, deluser, addgroup, delgroup, su . 还需要熟悉su,chown ,opkg,mkdir,服务操作 ...

  5. 深入浅出百度地图API开发系列(2):创建地图

    上一篇文章里,先介绍了一下百度地图API开发所涉及到的一些基础概念,包括投影,坐标系等基础概念,再有了这些基础后,我们可以开始开发自己的web地图了.先来个代码示例(建议大家都是用百度地图API大众版 ...

  6. linux 添加用户

    1.下面就开始来说怎么添加新用户 我们以添加一个用户名为jorcen的新用户为例来说明,执行下面的命令: # useradd jorcen 2.那么就新用户就添加完成,但是没有任何信息,新用户添加完成 ...

  7. 团体程序设计天梯赛-练习集L1-021. 重要的话说三遍

    L1-021. 重要的话说三遍 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 这道超级简单的题目没有任何输入. 你只需要把这句 ...

  8. express中ejs模板引擎

    1.在 app.js 中通过以下两个语句设置了 引擎类型 和页面模板的位置: app.set('views', __dirname + '/views'); app.set('view engine' ...

  9. C++开发必看 四种强制类型转换的总结

    C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast ...

  10. Java Web开发 之小张老师总结GET和POST区别

    get和post区别1.传输方式不同,get在request-line中传输(即在URL中传输).post在request-line及 request-body中传输(可认为隐藏传输)2.get传输长 ...