题意:

求在[a,b](a,b不含前导0)中的d−magic数中有多少个是m的倍数。

分析:

计数dp

Let’s call a number d-magic if digit d appears in decimal presentation of the number on even positions and nowhere else.

仔细读题并观察例子就可以明确d−magic数从左到右所有偶数位置上都是d,奇数位上不能是d

求[a,b],即可转化为求[1,a],[1,b]中的满足条件的数,最后相减,注意判断a是否满足条件。

设dp[i][j][k]表示前缀为i位,余数为j,等于(1)或者小于(0)上限的方案数。容易想到状态转移的过程,注意分填入的数字小于和等于上限对应元素两种情况处理。

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. const int mod = 1e9+7, maxn = 2005;
  4. int m, d;
  5. int dp[maxn][maxn][2];
  6. char a[maxn], b[maxn];
  7. int num[maxn];
  8. int solve(char* A)
  9. {
  10. memset(dp, 0, sizeof(dp));
  11. memset(num, 0, sizeof(num));
  12. int cnt = strlen(A);
  13. for(int i = 0; i < cnt; i++){
  14. num[i+1] = A[i] - '0';
  15. }
  16. for(int i = 1; i<=num[1];i++){
  17. if(i == d)continue;
  18. if(i < num[1]){
  19. dp[1][i%m][0]++;
  20. }else{
  21. dp[1][i%m][1]++;
  22. }
  23. }
  24. for(int i = 2; i <= cnt; i++){
  25. for(int j = 0; j < m; j++){
  26. if(i%2==0){
  27. dp[i][(j * 10 + d)%m][0] = (dp[i][(j * 10 + d)%m][0] + dp[i - 1][j][0])%mod;
  28. if(d < num[i])
  29. dp[i][(j * 10 + d)%m][0] = ( dp[i][(j * 10 + d)%m][0] + dp[i - 1][j][1])%mod;
  30. else if(d == num[i])
  31. dp[i][(j * 10 + d)%m][1] = ( dp[i][(j * 10 + d)%m][1] + dp[i-1][j][1])%mod;
  32. }else{
  33. for(int k = 0; k < 10; k++){
  34. if(k == d) continue;
  35. dp[i][(j * 10 + k)%m][0] = (dp[i][(j * 10 + k)%m][0] + dp[i - 1][j][0])%mod;
  36. if(k < num[i])
  37. dp[i][(j * 10 + k)%m][0] = ( dp[i][(j * 10 + k)%m][0] + dp[i - 1][j][1])%mod;
  38. else if(k == num[i])
  39. dp[i][(j * 10 + k)%m][1] = ( dp[i][(j * 10 + k)%m][1] + dp[i-1][j][1])%mod;
  40. }
  41. }
  42. }
  43. }
  44. return (dp[cnt][0][0] + dp[cnt][0][1])%mod;
  45. }
  46. int is(char* a)
  47. {
  48. int res = 0;
  49. for(int i = 0; i < strlen(a); i++){
  50. int a1 = a[i] - '0';
  51. if(i%2 == 0){
  52. if(a1 == d) return 0;
  53. }
  54. if(i%2==1){
  55. if(a1 != d) return 0;
  56. }
  57. res = (res*10 +a1)%m;
  58. }
  59. return res == 0;
  60. }
  61. int main (void)
  62. {
  63. scanf("%d%d",&m,&d);
  64. scanf("%s%s", a, b);
  65. printf("%d\n", (solve(b) - solve(a) +is(a)+mod)%mod) ;
  66. return 0;
  67. }

Codeforces 628D Magic Numbers的更多相关文章

  1. CodeForces 628D Magic Numbers (数位dp)

    题意:找到[a, b]符合下列要求的数的个数. 1.该数字能被m整除 2.该数字奇数位全不为d,偶数位全为d 分析: 1.dp[当前的位数][截止到当前位所形成的数对m取余的结果][当前数位上的数字是 ...

  2. Codeforces 320A Magic Numbers

    因为晚上有一个cf的比赛,而自己从来没有在cf上做过题,就找了道题熟悉一下. 题目大意:给一个数,判断是否能由1,14,144三个数连接得到. 代码如下: #include <stdio.h&g ...

  3. 628D Magic Numbers

    传送门 题目大意 定义n-magic为从左往右,偶数位置均为n,奇数位置不为n的一类数.求出[a,b]内所有可被m整除的d-magic个数. 分析 显然是数位dp,我们用dp[i][j][k]表示考虑 ...

  4. Magic Numbers CodeForces - 628D

    Magic Numbers CodeForces - 628D dp函数中:pos表示当前处理到从前向后的第i位(从1开始编号),remain表示处理到当前位为止共产生了除以m的余数remain. 不 ...

  5. Educational Codeforces Round 8 D. Magic Numbers 数位DP

    D. Magic Numbers 题目连接: http://www.codeforces.com/contest/628/problem/D Description Consider the deci ...

  6. Codeforces CF#628 Education 8 D. Magic Numbers

    D. Magic Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  7. Educational Codeforces Round 8 D. Magic Numbers

    Magic Numbers 题意:给定长度不超过2000的a,b;问有多少个x(a<=x<=b)使得x的偶数位为d,奇数位不为d;且要是m的倍数,结果mod 1e9+7; 直接数位DP;前 ...

  8. CodeForces 628 D Magic Numbers 数位DP

    Magic Numbers 题意: 题意比较难读:首先对于一个串来说, 如果他是d-串, 那么他的第偶数个字符都是是d,第奇数个字符都不是d. 然后求[L, R]里面的多少个数是d-串,且是m的倍数. ...

  9. Codeforces Round #189 (Div. 2) A. Magic Numbers【正难则反/给出一个数字串判断是否只由1,14和144组成】

    A. Magic Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

随机推荐

  1. Java 线程实例 刷碗烧水和倒计时

    线程——烧水刷碗和倒计时实例 (一)烧水刷碗 刷碗的同时烧水:下面是碗的程序: 下面是烧水的程序:在水的实现类中,调用了Thread线程,让烧水刷碗同时进行. 注意:刷碗2s一次,烧水10s (二)1 ...

  2. 简洁大方的wordpress主题,不容错过的主题,附带主题源码下载

    cu主题是由疯狂的大叔设计,界面简洁大方是它最大的特点之一. 手残君也比较喜爱这款主题,在使用的过程中,根据手残君的个人习惯,对其进行了优化. 标题优化 标题居中显示 增加标题div背景色 标题div ...

  3. Java集合框架源码(三)——arrayList

    1. ArrayList概述: ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些方法来操作内部 ...

  4. Red Hat Linux常用命令

    1.查看机器型号 [root@local ~]# dmidecode | grep "Product Name" Product Name: VMware Virtual Plat ...

  5. Bing图片下载器(Python实现)

    分享一个Python实现的Bing图片下载器.下载首页图片并保存到到当前目录.其中用到了正则库re以及Request库. 大致流程如下: 1.Request抓取首页数据 2.re正则匹配首页图片URL ...

  6. call、apply/bind的区别和用法(简单粗暴的解释)

    var obj1={ name:"bob", age:20 } var obj2={ name:"coco", age:22 } function getAge ...

  7. 如何选安卓android|linux系统开发板,简化学习难度,缩短开发进程

    平台一:iTOP-4412精英版 系统支持:Android 4.0.3系统  / Android 4.4系统 / Linux + Qt系统 / Ubuntu12.04系统 开发板特点:Cortex-A ...

  8. Swift 中的值类型与引用类型

    顶级修饰 次级修饰 赋值类型 存储类型 值类型 值类型   深拷贝 栈 值类型 引用类型 浅拷贝 堆 引用类型 值类型 浅拷贝 堆 引用类型 引用类型 浅拷贝 堆 复合引用类型会改变内部值类型的存储行 ...

  9. swift @objc dynamic

    @objc vs @objc dynamic @objc:  Objective-C entry points One can explicitly write @objc on any Swift ...

  10. 用Go向MySQL导入.csv文件

    今天来更新一个很少碰到,但碰到了又让人十分蛋疼的问题——Go语言中执行MySQL的load data local infile语句报local file 'xxx' is not registered ...