题目链接:https://www.luogu.com.cn/problem/P3413

题目大意:

定义萌数指:满足“存在长度至少为2的回文子串”的数。

求区间 \([L,R]\) 范围内萌数的数量。

解题思路:

使用 数位DP 进行求解。

定义状态 \(f[pos][p1][p2]\) 表示满足如下条件时的方案数:

  • 当期数位在第 \(pos\) 位;
  • 前面那个数的前面那个数是 \(p1\);
  • 前面那个数是 \(p2\)。

则可以开函数 dfs(int pos, int p1, int p2, bool limit) 进行求解,其中:

  • \(pos,p1,p2\) 的含义同上;
  • \(limit\) 表示当前是否处于限制状态。

注意:数的位数是1000位,所以一开始的输入得用字符串输入,然后再转换。

实现代码如下:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const long long MOD = 1000000007;
  4. long long f[1010][10][10], pow10[1010];
  5. int a[1010];
  6. char ch[1010];
  7. void init() {
  8. memset(f, -1, sizeof(f));
  9. pow10[0] = 1;
  10. for (int i = 1; i <= 1000; i ++) pow10[i] = pow10[i-1] * 10 % MOD;
  11. }
  12. long long dfs(int pos, int p1, int p2, bool limit) {
  13. if (pos < 0) return 0; // 因为我一旦找到回文子串会返回,所有到pos<0时还没有找到就直接返回0了
  14. if (!limit && p1!=-1 && p2!=-1 && f[pos][p1][p2] != -1) return f[pos][p1][p2];
  15. int up = limit ? a[pos] : 9;
  16. long long tmp = 0;
  17. for (int i = 0; i <= up; i ++) {
  18. if (p1 == i || p2 == i) {
  19. if (limit && i==up) {
  20. // tmp += num % pow10[pos] + 1; // 不能这么算,因为是大数
  21. long long t = 0;
  22. for (int j = pos-1; j >= 0; j --)
  23. t = (t * 10 + a[j]) % MOD;
  24. tmp += t + 1;
  25. }
  26. else tmp += pow10[pos] % MOD;
  27. }
  28. else
  29. tmp += dfs(pos-1, p2, (p2==-1&&i==0&&pos>0)?-1:i, limit && i==up);
  30. tmp %= MOD;
  31. }
  32. if (!limit && p1!=-1 && p2!=-1) f[pos][p1][p2] = tmp;
  33. // printf("dfs pos=%d, p1=%d, p2=%d, limit=%d, tmp = %lld\n", pos, p1, p2, limit, tmp);
  34. return tmp;
  35. }
  36. long long get_num(bool minus1) {
  37. cin >> ch;
  38. int len = strlen(ch);
  39. for (int i = 0; i < len; i ++) a[i] = ch[len-1-i] - '0';
  40. // 判断是否为0
  41. bool all0 = true;
  42. for (int i = 0; i < len; i ++) if (a[i] != 0) { all0 = false; break; }
  43. if (all0) return 0;
  44. // 判断是否要减1
  45. if (minus1) {
  46. a[0] --;
  47. for (int i = 0; i < len; i ++) {
  48. if (a[i] < 0) { a[i] += 10; a[i+1] --; }
  49. else break;
  50. }
  51. }
  52. return dfs(len-1, -1, -1, true);
  53. }
  54. int main() {
  55. init();
  56. long long num_l = get_num(true);
  57. long long num_r = get_num(false);
  58. cout << (num_r - num_l + MOD) % MOD << endl;
  59. return 0;
  60. }

洛谷P3413 SAC#1 - 萌数 题解 数位DP的更多相关文章

  1. 洛谷P3413 SAC#1 - 萌数(数位dp)

    题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的.只有满足“存在长度至少为2的回文子串”的数是萌的——也就是说,101是萌的,因为101本身就是一个回文数:1 ...

  2. [洛谷P3413]SAC#1 - 萌数

    题目大意:求$[l,r](0\leqslant l<r< 10^{1001})$中存在长度至少为$2$的回文串的数字数 题解:数位$DP$,发现如果有回文串,若长度为偶数,一定有两个相同的 ...

  3. 洛谷 P3413 SAC#1 - 萌数

    题意简述 求l~r之间存在长度至少为2的回文子串的正整数的个数 题解思路 数位DP 注意到有偶数长度的回文串必有长度为2的回文串,有奇数长度的回文串必有长度为3的回文串 所以只需判断与前一位,前两位是 ...

  4. [luoguP3413] SAC#1 - 萌数(数位DP)

    传送门 gtm的数位dp! 看到好多题解,都是记忆化搜索,好像非常方便啊,但是我还是用递推好了,毕竟还是有些类似数位dp的题用递推的思路,记忆化做不了,现在多培养一下思路 首先这道题, 只看长度大于等 ...

  5. 洛谷$ P$4317 花神的数论题 数位$dp$

    正解:数位$dp$ 解题报告: 传送门! 开始看到感觉有些新奇鸭,仔细一想发现还是个板子鸭,,, 考虑设$f_{i}$表示$sum[j]=i$的$j$的个数 日常考虑$dfs$呗,考虑变量要设哪些$Q ...

  6. P3413 SAC#1 - 萌数

    题目 洛谷 数位动规用爆搜真好玩 做法 含有回文串实际我们仅需判断是否有\(2/3\)回文串 \(Dfs(now,num,pre,ly,lead,prel,top)\): 在第\(now\)位 \(n ...

  7. LUOGU P3413 SAC#1 - 萌数(数位dp)

    传送门 解题思路 首先这道题如果有两个以上长度的回文串,那么就一定有三个或两个的回文串,所以只需要记录一下上一位和上上位填的数字就行了.数位\(dp\),用记忆化搜索来实现.设\(f[i][j][k] ...

  8. luogu2657-Windy数题解--数位DP

    题目链接 https://www.luogu.org/problemnew/show/P2657 分析 第一道数位DP题,发现有点意思 DP求\([L,R]\)区间内的XXX个数,很套路地想到前缀和, ...

  9. 洛谷 P1609 最小回文数 题解

    这题其实并不难,重点在你对回文数的了解,根本就不需要高精度. 打个比方: 对于一个形如 ABCDEFGH 的整数 有且仅有一个比它大的最小回文数 有且仅有一个比它小的最大回文数 而整数 ABCDDCB ...

随机推荐

  1. MySQL数据库优化(五)——MySQL查询优化

    http://blog.csdn.net/daybreak1209/article/details/51638187 一.mysql查询类型(默认查询出所有数据列)1.内连接       默认多表关联 ...

  2. react框架下,在页面内加载显示PDF文件,关于react-pdf-js的使用注意事项

    react框架下,在页面内加载显示PDF文件,关于react-pdf-js的使用注意事项 之前做了一个需求,在注册账号的时候,让用户同意服务条款, 服务条款是一个PDF文件, 这就需要在react内加 ...

  3. nginx简单使用(windows)

    本篇文章对术语不作讲解 下载nginx 首先,进入nginx官网http://nginx.org/en/download.html. 找到Stable version,此处的版本是稳定版本: 下载完成 ...

  4. H3C 帧中继网络拓扑

  5. H3C PPP显示与调试

  6. C# 16 进制字符串转 int

    最近在写硬件,发现有一些测试是做 16 进制的字符串,需要把他转换为整形才可以处理. 本文告诉大家如何从 16 进制转整形 如果输入的是 0xaa 这时转换 int 不能使用 Parse 不然会出现异 ...

  7. 用adblock过滤页面上固定位置的悬浮窗

    现在各种网站都喜欢加入position:fixed的悬浮窗,这些悬浮窗可以是分享按钮,可以是二维码,可以是各种烦人的按钮. 因为这些悬浮窗未必是广告,所以adblock很少自动屏蔽它们. 可这些悬浮窗 ...

  8. httpclient: Content-Length header already present问题

    现象:用httpclient发送http请求时,客户端返回: org.apache.http.client.ClientProtocolException at org.apache.http.imp ...

  9. 【ts】 VSCode自动编译TypeScript终端报错

    一.点击终端--运行任务--选择tsc:监视 - tsconfig.json后,终端报出了如下错误:error TS5058: The specified path does not exist 在网 ...

  10. java打包上传服务器的一些命令

    Maven下package打包成jar包和war包,都在target目录下 其中War包扔在tomcat的webapps目录下.随tomcat启动自行启动 运行jar包命令. nohup java - ...