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 {
12     int w=1;
13     x=0;
14     char ch=getchar();
15     while(ch>‘9‘||ch<‘0‘)
16     {
17         if(ch==‘-‘)
18             w=-1;
19         ch=getchar();
20     }
21     while(ch>=‘0‘&&ch<=‘9‘)
22     {
23         x=(x<<3)+(x<<1)+ch-‘0‘;
24         ch=getchar();
25     }
26     x*=w;
27 }
28 void input()
29 {
30     freopen("input.txt","r",stdin);
31 }
32 void dv(int x)
33 {
34     tot=0;
35     while(x)
36     {
37         e[++tot]=x%10;
38         x/=10;
39     }
40     e[tot+1]=0;
41 }
42 long long dfs(int pos,bool limit,bool zero,int pre,int qpre,bool dc)
43 {
44     if(pos==0)
45         return dc;
46     if(!limit&&c[pos][pre][dc]!=-1)
47         return c[pos][pre][dc];
48     int up=limit?e[pos]:9;
49     long long ans=0;
50     for(int i=0;i<=up;++i)
51         ans+=dfs(pos-1,limit&&(i==up),zero||i,i,zero?pre:-1,dc||(i==pre&&zero)||(i==qpre&&zero))%mod;
52     if(!limit&&zero&&qpre!=-1)
53         c[pos][pre][dc]=ans;
54     return ans;
55 }
56 long long solve()
57 {
58     //dv(x);
59     tot=0;
60     while(m--)
61         e[++tot]=r[m]-‘0‘;
62     while(!e[tot])
63         --tot;
64     memset(c,-1,sizeof(c));
65     long long ans=dfs(tot,1,0,-1,-1,0)%mod;
66     tot=0;
67     while(n--)
68         e[++tot]=l[n]-‘0‘;
69     while(!e[tot])
70         --tot;
71     memset(c,-1,sizeof(c));
72     ans-=dfs(tot,1,0,-1,-1,0)%mod;
73     return ans;
74 }
75 void read()
76 {
77     scanf("%s%s",l,r);
78     n=strlen(l);
79     m=strlen(r);
80 }
81 void work()
82 {
83     int i=1;
84     while(l[n-i]==‘0‘&&n>i)
85     {
86         l[n-i]=‘9‘;
87         ++i;
88     }
89     l[n-i]-=1;
90     printf("%lld",(solve()+mod)%mod);
91 }
92 int main()
93 {
94     //input();
95     read();
96     work();
97     return 0;
98 }

原文地址:https://www.cnblogs.com/Achensy/p/11002149.html

时间: 2024-09-30 21:17:21

luoguP3413 萌数的相关文章

luogu 3413 SAC#1 - 萌数

题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的.只有满足“存在长度至少为2的回文子串”的数是萌的——也就是说,101是萌的,因为101本身就是一个回文数:110是萌的,因为包含回文子串11:但是102不是萌的,1201也不是萌的. 现在SOL想知道从l到r的所有整数中有多少个萌数. 由于答案可能很大,所以只需要输出答案对1000000007(10^9+7)的余数. 输入输出格式 输入格式: 输入包含仅1行,包含两个整数:l.r. 输出格式: 输出仅1行

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

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

2015长春区域赛赛后总结

比赛时间:2015.10.18 队名:哆啦小黄埋(alone kampai UMR) 成员:ST,QL,WC 解出题目:两道 网络赛的时候并没有出线,老师争取到了女队名额,才有了参加区域赛的机会(谢谢老师么么哒~ 这次的比赛打铁没有什么可怨的,实力不足+比赛策略不当+心里素质差,每一条都是超级致命的(哭 过了的两道水题,L和F,L是经过ST和WC讨论之后1A的,F是我和ST讨论过敲得,ST去看其他题,而我就在一直卡题.由于代码奇葩,队友都看不懂,只能干着急+出数据,所以只能自己调试,WA好多发,

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

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

数位dp小练

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

萌新的旅行-

Description zstu的萌新们准备去自助旅行,他们租了一辆吉普车,然后选择了n个城市作为游览地点.然后他们惊喜的发现他们选择的城市刚好绕城一个环. 也就是说如果给所有城市按照0,1,2,--,n-1编号,0号城市和n-1号城市是相邻的,并且只能从i号城市去(i+1)%n号城市. 已知每个城市可以充油gas(i),从 i 到 (i+1)%n 城市耗油 cost(i). 假设这辆吉普车没有的油箱一开始是空的,并且没有上限. 没有油的话自然就不能继续旅行了,这个问题让萌新们非常困扰.作为优秀

艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)

艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项目地址:http://www.51aspx.com/code/MSDCArtMengFileUpload 咨询qq:286275658 演示程序下载地址:http://pan.baidu.com/s/1geVfmcr 服务器端运行效果图: 服务器端配置文件: <?xml version="1.

反差萌

反差萌 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 0    Accepted Submission(s): 0 Problem Description 有2N个人,每人有个萌值Mi(1<=i<=2N). 要求将他们分为N对,使得反差值之和最大. 其中反差值的含义如下:若x和y是一对,则他们贡献|Mx-My|点反差值. Input

康托尔是怎样发现超限数的?

大家知道,超限数(Transfinite)集合论的核心概念.我们搞清除了超限数是怎样发现的这个问题,实质上就等于搞清除了集合论是怎样创立的. 在三维空间中,坐标原点O的直角坐标是(0,0,0).由此,我们可以推想,在无限维空间中,也有类似情况.回顾历史,19世纪的欧洲,三角级数是一个非常热门的研究领域.但是,三角级数收敛的关键问题是极限函数变现的唯一性,如果三角级数收敛的唯一性不能证明,整个现代数学必然是乱糟糟的了. 在当时情况下,许多知名数学家都知道上述问题是个"硬骨头",不敢问津.