luogu 3413 SAC#1 - 萌数

题目描述

辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌!

好在在他眼里,并不是所有数都是萌的。只有满足“存在长度至少为2的回文子串”的数是萌的——也就是说,101是萌的,因为101本身就是一个回文数;110是萌的,因为包含回文子串11;但是102不是萌的,1201也不是萌的。

现在SOL想知道从l到r的所有整数中有多少个萌数。

由于答案可能很大,所以只需要输出答案对1000000007(10^9+7)的余数。

输入输出格式

输入格式:

输入包含仅1行,包含两个整数:l、r。

输出格式:

输出仅1行,包含一个整数,即为答案。

输入输出样例

输入样例#1: 复制

1 100

输出样例#1: 复制

10

输入样例#2: 复制

100 1000

输出样例#2: 复制

253

说明

记n为r在10进制下的位数。

对于10%的数据,n <= 3。

对于30%的数据,n <= 6。

对于60%的数据,n <= 9。

对于全部的数据,n <= 1000,l < r。

用记忆化搜索实现数位dp

如果没有限位就可以记忆化

有限位就要往下递归

还要考虑前导0

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 typedef long long lol;
 8 lol f[1001][12][12][2],Mod=1e9+7;
 9 char s1[1001],s2[1001],s[1001];
10 lol dfs(int pos,int pre,int bef,int t,int k,int flag)
11 {int i;
12   if (pos<0) return t;
13   if (!flag&&f[pos][pre+1][bef+1][t]!=-1) return f[pos][pre+1][bef+1][t];
14   int end;
15   lol cnt=0;
16   if (flag) end=s[pos]-‘0‘;
17   else end=9;
18   for (i=0;i<=end;i++)
19     {
20       cnt+=dfs(pos-1,i,k?pre:-1,t||((i==pre)&&k)||((i==bef)&&k),k||(i!=0),flag&&(i==end));
21       cnt%=Mod;
22     }
23   if (!flag&&k&&bef!=-1) f[pos][pre+1][bef+1][t]=cnt;
24   return cnt;
25 }
26 lol solve(char ch[])
27 {int i;
28   memset(f,-1,sizeof(f));
29   int len=strlen(ch);
30   for (i=0;i<len;i++)
31     s[len-i-1]=ch[i];
32   while (s[len-1]==‘0‘) len--;
33   return dfs(len-1,-1,-1,0,0,1);
34 }
35 int main()
36 {int i;
37   cin>>s1>>s2;
38   int len=strlen(s1);
39   s1[len-1]--;
40   for (i=len-1;i>=0;i--)
41     if (s1[i]<‘0‘) s1[i]+=10,s1[i-1]--;
42   printf("%lld\n",(solve(s2)-solve(s1)+Mod)%Mod);
43 }

原文地址:https://www.cnblogs.com/Y-E-T-I/p/8466813.html

时间: 2024-09-30 09:19:18

luogu 3413 SAC#1 - 萌数的相关文章

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

传送门 解题思路 首先这道题如果有两个以上长度的回文串,那么就一定有三个或两个的回文串,所以只需要记录一下上一位和上上位填的数字就行了.数位\(dp\),用记忆化搜索来实现.设\(f[i][j][k][0/1]\)表示填到了第\(i\)位,上上位数字为\(j\),上一位数字为\(k\),\(0/1\)表示有没有出现过回文串的方案数.\(dfs\)里在套路的传一个这一位有没有限制和前导0,细节还是比较多的. 代码 #include<iostream> #include<cstdio>

【luogu 2774】方格取数 (最小割)

题目链接 [题目大意] 有n*m的方格,在其中取任意个格子的数,保证最终结果最大,取得数字不能相邻 [题目思路] 如果不是知道是网络流的题,大概会试下爆搜,取之后周围的不可取之类的,但是显而易见会T 然后考虑怎么用网络流做,为什么能用网络流做 我自己对于网络流的理解,是解决选择之间的直接冲突,从而得到最优解的方法,而这个题每一个数字选和不选之间就会发生冲突 [建图] 如何实现选择 拆点,这里大多数程序都是将点根据(i+j)分成两类,我觉得是为了代码更简洁些,如果把所有点都拆成两个的话还是可行的

【Luogu】P2045方格取数加强版(最小费用最大流)

题目链接 通过这题我学会了引诱算法的行为,就是你通过适当的状态设计,引诱算法按照你想要它做的去行动,进而达到解题的目的. 最小费用最大流,首先将点拆点,入点和出点连一条费用=-权值,容量=1的边,再连费用=0,容量=INF的边,跑最小费用最大流即可. #include<cstdio> #include<cctype> #include<algorithm> #include<cstring> #include<cstdlib> #include&

luoguP3413 萌数

1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e3+5; 4 const int mod=1e9+7; 5 int n,m,mark; 6 char l[maxn],r[maxn]; 7 int numl,numr; 8 int tot,e[maxn]; 9 long long c[maxn][20][2]; 10 template<class t>void red(t &x) 11 {

Luogu P3931 SAC E#1 - 一道难题 Tree 题解

闲扯 为了学习最小割到了这道题,但是看题解的时候发现做法还有树形 \(DP\) 毕竟没怎么认真想过题,写完最小割之后,顺手来了发树形 \(DP\) ,然后就过了,感觉真爽啊~~ 题面 题面 Solution 解法一:最小割最大流 因为要求是所有的叶节点都不能到达根结点,而且可以删除边,要求删边的最小代价,看着就很像最小割.但是仔细一看,发现割完之后叶节点组成了很多个点集,怎么办? 我们只需要再虚拟一个超级汇点,将所有的根结点全部连向该节点,且边的流量均为 \(INF\) .(因为这些边是我们人为

luogu CF932E Team Work |斯特林数

一句话: 求 \(\sum^{n}_{i=1}{C(n,i)*i^k}\) 题解 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define ll long long const int mod=1e9+7,_=5e3+10; inline int read(){ int x=0,f=1; char c=getchar(); while(c<'0'||c&

数位dp小练

最近刷题的同时还得填填坑,说来你们也不信,我还不会数位dp. 照例推几篇博客: 数位DP讲解 数位dp 的简单入门 这两篇博客讲的都很好,不过代码推荐记搜的形式,不仅易于理解,还短. 数位dp的式子一般是这样的:dp[i][][]表示到第\(i\)位,而后面几维就因题而异了. 不过通用的思想就是利用前缀相减求出区间信息. 算了上题吧. [SCOI2009]windy数 这都说是数位dp入门题. 根据这题,受到影响的数只有相邻两个,因此dp[i][j]表示到第\(i\)位(从高往低)上一位的数\(

数位dp——奏响数字数位的美妙乐章

数位dp:处理数字数位关系的一种dp方式. 一般的题目特征十分明显: 1.一般和数字本身有很大关系. 2.一般求数字在区间L,R中的一些信息 3.L,R一般很大,通常能达到long long级别. dp方式也比较有套路: 一般有三种方法: 本质上的相似之处,都是集中在处理"填数有无限制","填数无限制情况下的固定方案数","某些已经搜出来的固定方案数" 1.记忆化搜索(没用过) 是一种倒着记忆的方法. 2.递推(我基本都是这个方法) 正着递推出答

浴谷夏令营题单

这是群里一位神犇整理的,我只负责将它们做完. 一.暴力.搜索Luogu 1588 丢失的牛Luogu 1463 [SDOI2005]反素数antBzoj 1085 [SCOI2005]骑士精神Luogu 1019 单词接龙Luogu 1078 文化之旅Luogu 1312 Mayan游戏Luogu 3823 蚯蚓排队Codeforces 444B Codeforces 555DLuogu 1979 华容道 二.初等数论Poj 3292 H合成数Luogu 1890 gcd区间Luogu 1029