题目链接: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位,所以一开始的输入得用字符串输入,然后再转换。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000007;
long long f[1010][10][10], pow10[1010];
int a[1010];
char ch[1010];
void init() {
memset(f, -1, sizeof(f));
pow10[0] = 1;
for (int i = 1; i <= 1000; i ++) pow10[i] = pow10[i-1] * 10 % MOD;
}
long long dfs(int pos, int p1, int p2, bool limit) {
if (pos < 0) return 0; // 因为我一旦找到回文子串会返回,所有到pos<0时还没有找到就直接返回0了
if (!limit && p1!=-1 && p2!=-1 && f[pos][p1][p2] != -1) return f[pos][p1][p2];
int up = limit ? a[pos] : 9;
long long tmp = 0;
for (int i = 0; i <= up; i ++) {
if (p1 == i || p2 == i) {
if (limit && i==up) {
// tmp += num % pow10[pos] + 1; // 不能这么算,因为是大数
long long t = 0;
for (int j = pos-1; j >= 0; j --)
t = (t * 10 + a[j]) % MOD;
tmp += t + 1;
}
else tmp += pow10[pos] % MOD;
}
else
tmp += dfs(pos-1, p2, (p2==-1&&i==0&&pos>0)?-1:i, limit && i==up);
tmp %= MOD;
}
if (!limit && p1!=-1 && p2!=-1) f[pos][p1][p2] = tmp;
// printf("dfs pos=%d, p1=%d, p2=%d, limit=%d, tmp = %lld\n", pos, p1, p2, limit, tmp);
return tmp;
}
long long get_num(bool minus1) {
cin >> ch;
int len = strlen(ch);
for (int i = 0; i < len; i ++) a[i] = ch[len-1-i] - '0';
// 判断是否为0
bool all0 = true;
for (int i = 0; i < len; i ++) if (a[i] != 0) { all0 = false; break; }
if (all0) return 0;
// 判断是否要减1
if (minus1) {
a[0] --;
for (int i = 0; i < len; i ++) {
if (a[i] < 0) { a[i] += 10; a[i+1] --; }
else break;
}
}
return dfs(len-1, -1, -1, true);
}
int main() {
init();
long long num_l = get_num(true);
long long num_r = get_num(false);
cout << (num_r - num_l + MOD) % MOD << endl;
return 0;
}

洛谷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. Libev源码分析07:Linux下的eventfd简介

    #include <sys/eventfd.h> int eventfd(unsigned int initval, int flags); eventfd创建一个eventfd对象,该对 ...

  2. php第三方登录(微博登录,仿照慕课网)

    https://www.cnblogs.com/haoyu521/p/5606931.html 1:开发之前,请大家先自行熟悉一下OAuth协议原理. 2:我们开发需要具备一个外网可访问的线上域名,如 ...

  3. 在线学编程!十大IT在线教育网站推荐

    在线学编程!十大IT在线教育网站推荐 1.CSDN学院(http://edu.csdn.net/) CSDN学院是CSDN推出的一个面向中国软件开发者和IT专业人员的技术教育服务平台.主要提供IT领域 ...

  4. python2和python3一些不同

    文件写法: #python2fp=file(filepath,'wb')#python3# fp = open(filepath, 'wb') 关于乱码问题: #python2 #coding=utf ...

  5. name和code的相关设置

    cdm中同时显示name和code tools->或右键Displace preferences->Entity->Advanced->Attributes->右侧Lis ...

  6. 通过Ajax提交form表单来提交上传文件

    Ajax 提交form方式可以将form表单序列化 然后将数据通过data提交至后台,例如: $.ajax({      url : "http://localhost:8080/" ...

  7. 获取checkbox返回值

    <div class="checkbox"> <label> <input type="checkbox" value=" ...

  8. Asp.net MVC中如何获取控制器的名称

    如果在代码中 当前controller.action的获取RouteData.Route.GetRouteData(this.HttpContext).Values["controller& ...

  9. [转]swagger2 入门教程

    swagger2 是一个规范和完整的框架,用于生成.描述.调用和可视化Restful风格的web服务,现在我们使用spring boot 整合它 作用: 1.接口的文档在线自动生成 2.功能测试 先介 ...

  10. java面向接口编程之适配器模式

    使用一个现成的类,但是它的接口不完全符合你的需求,我只想要它其中的一个方法,不想覆写其他的方法. 比如,窗体有变大,变小,关闭的行为,但是我现在只需要关闭行为;   package reviewDem ...