比较友好的数位\(dp\)练手题。

设\(dp(i,j,k=0/1)\)表示还剩\(i\)位,前几位表示的数\(\equiv\text{ j (mod m)}\),此位是否为偶数位的数的个数。

如果\(k=0\),那么这一位一定不能是\(d\)。否则一定得是\(d\)。大力转移即可。
边界:\(dp(0,0,0/1)=1\).

特别注意本题并不需要高精\(+1\)操作,只需要特判\(b\)一个数即可。

/*** @Author: Mingyu Li* @Date:   2019-03-10T15:39:26+08:00* @Email:  class11limingyu@126.com* @Filename: cf628D.cpp* @Last modified by:   Mingyu Li* @Last modified time: 2019-03-10T20:44:04+08:00*/#include <bits/stdc++.h>
#define tpname typename
#define Go(i , x , y) for(register int i = x; i <= y; i++)
#define God(i , y , x) for(register int i = y; i >= x; i--)
typedef long long LL;
typedef long double ld;
typedef unsigned long long ULL;
template < tpname T > void sc(T& t) {char c = getchar(); T x = 1; t = 0; while(!isdigit(c)) {if(c == '-') x = -1; c = getchar();}while(isdigit(c)) t = t * 10 + c - '0' , c = getchar();t *= x;
}
template < tpname T , tpname... Args > void sc(T& t , Args&... args) {sc(t); sc(args...);}
template < tpname T > T mul(T x , T y , T _) {x %= _,y %= _; return ((x * y - (T)(((ld)x * y + 0.5) / _) * _) % _ + _) % _;
}const int N = 2000 + 5;
const int mod = (int)(1e9 + 7);
int m , D , p;
std::string a,b;
int d[2000];
// f[i][j][k]:
// 还剩i位 前几位组成的数%m = j  是否是偶数位int dp[N][N][2];
int f(int i , int j ,int k) {if(dp[i][j][k] != -1) return dp[i][j][k];if(i == 0) return dp[i][j][k] = j%m == 0 ? 1 : 0;int ans = 0;Go(x , 0 , 9) {if(k == 1 && x != D) continue;if(k == 0 && x == D) continue;ans = (ans + f(i-1 , (j*10 + x)%m , k^1)) % mod;}return dp[i][j][k] = ans;
}int cal(std::string x) {p = 0;while(!x.empty()) {d[p++] = x.back() - '0';x.pop_back();}int op=0 , ans=0;God(i , p-1 , 1) {Go(j , 1 , 9) {if(j == D) continue;ans = (ans + f(i-1 , j%m , 1)) % mod;}}op = 0; int lst = 0;God(i , p-1 , 0) {Go(j , (i == p-1) ? 1 : 0 , d[i] - 1) {if(op == 1 && j != D) continue;if(op == 0 && j == D) continue;ans = (ans + f(i , (lst * 10 + j) % m , op^1)) % mod;}if(op == 1 && d[i] != D) break;if(op == 0 && d[i] == D) break;op = 1 - op;lst = (lst * 10 + d[i]) % m;}return ans;
}
int main() {memset(dp , -1 , sizeof(dp));sc(m , D);std::cin >> a >> b;int ans = (cal(b) - cal(a) + mod) % mod;bool f = 1 , op = 0;int m1 = 0;Go(i , 0 , (int)(b.size()) - 1) {if(op == 0 && b[i]-'0'== D) f = 0;if(op == 1 && b[i]-'0' != D) f = 0;op = op^1;}for(char x : b) m1 = (m1 * 10 + x - '0')%m;ans += (f & (m1 == 0));ans %= mod;std::cout << ans << std::endl;return 0;
}

转载于:https://www.cnblogs.com/LiM-817/p/10887225.html

[CF628D]Magic Numbers 题解相关推荐

  1. CF628D Magic Numbers (数据大+数位dp)求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数...

    题意:求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数(这里的偶数位是的是从高位往低位数的偶数位).a,b<10^2000,m≤2000,0≤d≤9 a,b< ...

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

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

  3. Codeforces791:Ordinary Numbers题解

    Codeforces Round#791(Div.3) B.Ordinary Numbers Ordinary Numbers题解 Codeforces Round#791(Div.3) B.Ordi ...

  4. Notable magic numbers

    Hexspeak From Wikipedia, the free encyclopedia //z 2014-11-11 11:31:41 L.50 '44899 BG57IV3@XCL T4159 ...

  5. CodeForces - 628D Magic Numbers(数位dp)

    题目链接:点击查看 题目大意:首先规定一个不含前导零的数字如果满足: 从最高位开始,偶数位置全为 ddd 从最高位开始,奇数位置不能出现 ddd 则称该数字为 d−magicd-magicd−magi ...

  6. codeforces #235 D. Roman and Numbers 题解

    转载请注明:http://blog.csdn.net/jiangshibiao/article/details/23100595 [原题] D. Roman and Numbers time limi ...

  7. Hexadecimal's Numbers 题解

    点此打开原题链接:传送门 !!!!!: C. Hexadecimal's Numbers time limit per test 1 second memory limit per test 64 m ...

  8. codeforces 628D. Magic Numbers 数位dp

    题目链接 给两个数m, d. 两个数a, b. a, b长度小于2000, 长度相等.求在a, b之间的数x, x%m==0, 并且从高位往低位数, 奇数位的数全部不等于d, 偶数为的数全都等于d, ...

  9. 求余小技巧 码农场 » POJ 3641 Pseudoprime numbers 题解 《挑战程序设计竞赛》

    // return (a * b) % m LL mod_mult(LL a, LL b, LL m) {LL res = 0;LL exp = a % m;while (b){if (b & ...

最新文章

  1. java排序的例子_Java的8大排序的基本思想及实例解读
  2. 唯品会实时计算平台的演进之路
  3. 手动创建swap分区
  4. Python 连接 redis 模块
  5. 拉格朗日插值--11次切比雪夫多项式零点作为节点Python实现并计算误差
  6. wxWidgets:wxTreeCtrl 示例
  7. Java处理文件BOM头的方式推荐
  8. 信息学奥赛一本通(1196:踩方格)
  9. 最大子序列求和_最大连续子序列和
  10. 打破多项存储世界记录,宏杉科技表示很淡定
  11. MATLAB实现香农编码
  12. Pandas[加深学习]01-pandas基本数据结构
  13. Image Retrieval using Scene Graphs ——基于场景图的图像检索 读书笔记
  14. 做职场里的“超级英雄”,需要怎样的盔甲与工具?
  15. 一些好听的纯音乐及下载
  16. c语言将一个四位正整数倒排,输入一个四位正整数,将其逆序输出.如:输入1234,输出4321...
  17. 《迅雷链精品课》第十课:共识算法理论基础
  18. SGU 264 Travel(稳定婚姻匹配)
  19. MATLAB——求系统的零状态响应
  20. python并列排名_一日一技:Python实现有序列表并列排名

热门文章

  1. 跟着Nature学绘图!基于ggplot2的生存曲线绘制R包
  2. 英文短句100条摘抄
  3. LNMP一键安装包是什么?
  4. CSDN (中国软件开发联盟)泄密的两名嫌疑人已被刑事---白天工程师晚上做黑客
  5. soar-web 安装和使用体验
  6. 云计算P2V的迁移过程
  7. 二元固定信道(BSC)信道的MATLAB实现
  8. 使用ubuntu desktop是可能会用到的配置
  9. django的运行命令
  10. Unity Shader 热力图