洛谷P3413 SAC#1 - 萌数 题解 数位DP
题目链接: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的更多相关文章
- 洛谷P3413 SAC#1 - 萌数(数位dp)
题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的.只有满足“存在长度至少为2的回文子串”的数是萌的——也就是说,101是萌的,因为101本身就是一个回文数:1 ...
- [洛谷P3413]SAC#1 - 萌数
题目大意:求$[l,r](0\leqslant l<r< 10^{1001})$中存在长度至少为$2$的回文串的数字数 题解:数位$DP$,发现如果有回文串,若长度为偶数,一定有两个相同的 ...
- 洛谷 P3413 SAC#1 - 萌数
题意简述 求l~r之间存在长度至少为2的回文子串的正整数的个数 题解思路 数位DP 注意到有偶数长度的回文串必有长度为2的回文串,有奇数长度的回文串必有长度为3的回文串 所以只需判断与前一位,前两位是 ...
- [luoguP3413] SAC#1 - 萌数(数位DP)
传送门 gtm的数位dp! 看到好多题解,都是记忆化搜索,好像非常方便啊,但是我还是用递推好了,毕竟还是有些类似数位dp的题用递推的思路,记忆化做不了,现在多培养一下思路 首先这道题, 只看长度大于等 ...
- 洛谷$ P$4317 花神的数论题 数位$dp$
正解:数位$dp$ 解题报告: 传送门! 开始看到感觉有些新奇鸭,仔细一想发现还是个板子鸭,,, 考虑设$f_{i}$表示$sum[j]=i$的$j$的个数 日常考虑$dfs$呗,考虑变量要设哪些$Q ...
- P3413 SAC#1 - 萌数
题目 洛谷 数位动规用爆搜真好玩 做法 含有回文串实际我们仅需判断是否有\(2/3\)回文串 \(Dfs(now,num,pre,ly,lead,prel,top)\): 在第\(now\)位 \(n ...
- LUOGU P3413 SAC#1 - 萌数(数位dp)
传送门 解题思路 首先这道题如果有两个以上长度的回文串,那么就一定有三个或两个的回文串,所以只需要记录一下上一位和上上位填的数字就行了.数位\(dp\),用记忆化搜索来实现.设\(f[i][j][k] ...
- luogu2657-Windy数题解--数位DP
题目链接 https://www.luogu.org/problemnew/show/P2657 分析 第一道数位DP题,发现有点意思 DP求\([L,R]\)区间内的XXX个数,很套路地想到前缀和, ...
- 洛谷 P1609 最小回文数 题解
这题其实并不难,重点在你对回文数的了解,根本就不需要高精度. 打个比方: 对于一个形如 ABCDEFGH 的整数 有且仅有一个比它大的最小回文数 有且仅有一个比它小的最大回文数 而整数 ABCDDCB ...
随机推荐
- 利用阿里云容器服务打通TensorFlow持续训练链路
本系列将利用Docker和阿里云容器服务,帮助您上手TensorFlow的机器学习方案 第一篇:打造TensorFlow的实验环境 第二篇:轻松搭建TensorFlow Serving集群 第三篇:打 ...
- day7_python之面向对象高级-反射
反射:通过字符串去找到真实的属性,然后去进行操作 python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 1.两种方法访问对象的属性 cl ...
- css设置Overflow实现隐藏滚动条的同时又可以滚动
.scroll-list ul{ white-space: nowrap; -webkit-overflow-scrolling: touch; overflow-x: auto; overflow- ...
- 列出display的值,说明他们的作用。position的值, relative和 absolute定位原点是?
display的值: block 像块类型元素一样显示. none 像行内元素类型一样显示. inline-block 像行内元素一样显示, 但其内容像块类型元素一样显示. list-item 像块类 ...
- C#的循环语句(四)
一.while 循环(1).while 其实是for循环的变形写法for(int i = 1; i<=5;i++) {循环体:} 上面的for循环可以写成int i= 1:for(;i< ...
- JOISC2014 Day2 E "交朋友" (思维+假的SCC)
传送门 题目描述 你是活跃在历史幕后的一名特工,为了世界和平而夜以继日地努力着. 这个世界有N个国家,编号为1..N; 你的目的是在这N个国家之间建立尽可能多的友好关系. 你为了制定一个特工工作的计划 ...
- Hamcrest使用
What is Hamcrest? 什么是Hamcrest? Hamcrest is a library of matchers, which can be combined in to crea ...
- vue-learning:28 - component - 组件事件的修饰符`.native / .sync`,以及组件属性`model`
组件事件的修饰符.native / .sync,以及组件属性model .native 原生事件修饰符 在一个组件中,如果我们为其绑定一个原生的点击事件@click,基本是无效的. 在vue中对组件绑 ...
- CFEducational Codeforces Round 66题解报告
CFEducational Codeforces Round 66题解报告 感觉丧失了唯一一次能在CF上超过wqy的机会QAQ A 不管 B 不能直接累计乘法打\(tag\),要直接跳 C 考虑二分第 ...
- C#面试题整理(不带答案)
1.维护数据库的完整性.一致性.你喜欢用触发器还是自写业务逻辑?为什么? 2.什么是事务?什么是锁? 3.什么是索引,有什么优点? 4.视图是什么?游标是什么? 5.什么是存储过程?有什么优 ...