SAC#1 - 萌数
时间:2019-09-25
本文章向大家介绍SAC#1 - 萌数,主要包括SAC#1 - 萌数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
洛咕
题意:只有满足“存在长度至少为2的回文子串”的数是萌的——也就是说,101是萌的,因为101本身就是一个回文数;110是萌的,因为包含回文子串11;但是102不是萌的,1201也不是萌的.求\([l,r]\)所有整数中有多少个萌数.由于答案可能很大,所以只需要输出答案对\(1e9+7\)的余数.记\(n\)为\(r\)在十进制下的位数,\(n<=1000,l<r.\)
分析:考虑求出\([l,r]\)内有多少个数不是萌数,它们一定满足第\(i\)位不等于第\(i-1\)位且第\(i\)位不等于第\(i-2\)位.(因为对于一个回文串\(a\),它在中心对称的地方一定满足\(a[i]=a[i-1]\)或者\(a[i]=a[i-2]\))
因为数字特别大,我们以字符串的形式读入,然后一边取模一边变成\(l,r\),设\([l,r]\)内有\(ans\)个数不是萌数,则最终的答案就是\(r-l+1-ans.\)
然后我们还是先求出\([1,r]\)内不是萌数的个数\(ans2\),再求\([1,l]\)内不是萌数的个数\(ans1\),然后我们判断一下\(l\)是不是萌数,若\(l\)不是萌数则\(--ans1\),则\([l,r]\)内不是萌数的个数为\(ans2-ans1\)个.(这样搞就可以不用判断\(l\)是否为\(0\)了).
一碰到字符串,就必定要注意数组下标等细节问题了.
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
const int mod=1e9+7;
string s1,s2;
int n,m,a[1005],b[1005];
ll l,r,dp[1005][10][10];
inline ll dfs(int tot,int pos,int pre2,int pre1,int lead,int limit){
if(pos>tot)return 1;//找到了一个不是萌数的数
if(pre2!=-1&&pre1!=-1)//防止数组下标越界
if(dp[pos][pre1][pre2]!=-1&&!lead&&!limit)return dp[pos][pre1][pre2];
ll cnt=0;int res=limit?a[tot+1-pos]:9;
for(int i=0;i<=res;++i){
if((i==pre1)||(i==pre2))continue;
if((!i)&&lead)cnt=(cnt+dfs(tot,pos+1,-1,-1,1,limit&&(i==res)))%mod;
else if(i&&lead)cnt=(cnt+dfs(tot,pos+1,-1,i,0,limit&&(i==res)))%mod;
else cnt=(cnt+dfs(tot,pos+1,pre1,i,0,limit&&(i==res)))%mod;
}
if(pre2!=-1&&pre1!=-1&&!lead&&!limit)dp[pos][pre1][pre2]=cnt;//防止数组下标越界
return cnt;
}
inline ll solve(){
for(int i=0;i<n;++i)a[i+1]=s1[n-1-i]-'0';//把下标挪到1-n来
memset(dp,-1,sizeof(dp));ll ans1=dfs(n,1,-1,-1,1,1);
for(int i=0;i<m;++i)a[i+1]=s2[m-1-i]-'0';
memset(dp,-1,sizeof(dp));ll ans2=dfs(m,1,-1,-1,1,1);
for(int i=0;i<n;++i)a[i+1]=s1[n-1-i]-'0';
--ans1;//先假设l不是萌数
for(int i=2;i<=n;i++)
if(a[i]==a[i-1]||(a[i]==a[i-2]&&(i-2>=1))){
ans1++;//如果l是萌数,再加回来
break;
}
return ans2-ans1;
}
int main(){
cin>>s1>>s2;n=s1.size();m=s2.size();
for(int i=0;i<n;++i)l=(1ll*l*10+s1[i]-'0')%mod;
for(int i=0;i<m;++i)r=(1ll*r*10+s2[i]-'0')%mod;
printf("%lld\n",((r-l+1-solve())%mod+mod)%mod);
return 0;
}
原文地址:https://www.cnblogs.com/PPXppx/p/11587900.html
- 使用密码记录工具keepass来保存密码
- 机器人带着VR学习,最后学会了人工智能
- 超经典的JBOSS入门文章
- ASP.NET2.0应用中定制安全凭证
- AI造的AI,比人造的还厉害,该喜还是该忧?
- Mono 3.2 测试NPinyin 中文转换拼音代码
- Reactive Extensions介绍
- Reactive Extensions(Rx) 学习
- 发布一个日期选择控件(ASPNET2.0)
- 做程序员压力山大,很多人都快疯了
- 小程序让交通出行变得如此简化,看看这些微信小程序你有在用了吗?
- 中小企业如何选择DDoS防御方案?
- “熊医生”出诊正确率超九成 医院:人工智能更多是辅助
- PLC编程优化方法,让程序运行提速!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用dplyr包对表格整理
- 安利 5 个拍案叫绝的 Matplotlib 骚操作!
- 多媒体程序开发
- 本地 IDE 已废!编辑器大结局!GitHub 的云 VSCode 实测
- 实战 | Python 编写端口扫描器
- 我这几年踩过的十个坑,每一条都是血泪教训
- 在 Python 中如何快速创建一个只读字典?
- 现场打脸:如何使用Selenium批量上传文件?
- 一日一技:FastAPI如何关闭接口文档?
- 什么叫做类比,为什么有些 Python 入门教程结构不合理?
- 贼好用的 Java 工具类库,墙裂推荐!
- 万字长文,Thread 类源码解析!
- lintCode 31 题解
- JDK1.8HashMap源码学习-put操作以及扩容(二)
- Python 中的数字到底是什么?