题目链接: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. HZOJ 分组

    打了好多个代码. 对于测试点1,11:手动模拟. void QJ1_11() { ) { int tk; ]+a[]))tk=; ; if(tk<=k) { puts("); puts ...

  2. HZOJ 回家

    这篇博客大部分在写我的错解……明明很简单的一道题,知道正解后10分钟AC,然而几个错解打的想死…… 错解1 WA40: 鬼知道这40分哪来的……这也是考试最后很无奈地交上去的代码,最后剩20分钟时发现 ...

  3. saltStack 配置管理(也就是替换文件)

    目录  /srv/salt/base下面新建一个文件dns.sls /opt/resolv.conf_bak:     #这个是文件替换的位置,也就说替换到远程文件的/opt/resolv.conf_ ...

  4. 9 模版语言 jinja2

    from flask import Flask,redirect,render_template,jsonify,send_file,request,Markup,sessionimport json ...

  5. 为更强大而生的开源关系型数据库来了!阿里云RDS for MySQL 8.0 正式上线!

    2019年5月29日15时,阿里云RDS for MySQL 8.0正式上线,使得阿里云成为紧跟社区步伐,发布MySQL最新版本的云厂商.RDS for MySQL 8.0 产品是阿里云推出的 MyS ...

  6. 学习HTML<audio>标签

    首先来看下这个例子: <audio controls autoplay="autoplay"> <source src="horse.ogg" ...

  7. PHP两个变量值互换(不用第三变量)

    <?php /**  * 双方变量为数字或者字符串时  * 使用list()和array()方法可以达到交换变量值得目的  */ $a = "This is A"; // a ...

  8. Ant Design的Form组件中FormItem名称相同引起的问题

    1.问题描述 在使用Antd组件Form表单的过程中,会出现FormItem同名的情况,此时要特别注意同名引起的表单行为异常问题,主要表现在以下方面: (1)同名表单项的值共享,并且其中一个的值改变, ...

  9. Python--day34--前面网络编程的复习

  10. linux 位操作

    atomic_t 类型在进行整数算术时是不错的. 但是, 它无法工作的好, 当你需要以原子方 式操作单个位时. 为此, 内核提供了一套函数来原子地修改或测试单个位. 因为整个操作 在单步内发生, 没有 ...