Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum
https://codeforces.com/contest/1073/problem/E
题意
求出l到r之间的符合要求的数之和,结果取模998244353
要求:组成数的数位所用的数字种类不超过k种
思路
这题一看就是个数位dp的模板题,但是由于以前没有完全理解数位dp加上xjb套模版,导致样例都没算出来
一开始这样定义状态
dp[i][j] 代表第cnt~i(高位到低位)位,cnt~i状态为j的总和
一直记录当前数字的数值,到边界的时候返回加到答案中,但是由于这样定义状态会导致一个状态对应多个数,但是他只能累加字典序最小的数到答案中,所以会使得有的数并没有被计算
仔细分析一波,回归dp本身,应该找到一个子状态,使得后面的状态可以通过前面的状态计算得到(转移),其实只需要改一下定义
dp[i][j] 代表0i(低位到高位),cnti+1状态为j的总和sum和数字个数num(dp两个东西)
在第i步选择第i位的数字其实就是转换一下计算方法,比如0~9可以加在数字1后,组成10~19,转化为公式\(10^{i-1}*dp[i-1][j|(1<<digit)].num*digit\)
转移为:\(dp[i][j]=\sum_{digit=0}^{9}(dp[i][j].sum+10^{i-1}*dp[i-1][j|(1<<digit)].num*digit)\)
关于数位dp
- 对于每个数求出的是小于这个数的所有满足条件的数(前缀和)
- 将一个数当成字符串,然后从高位往低位看,lead看前导0是否对计数产生影响
- 通常定义状态可以理解为
dp[i][j] 代表0i(低位到高位),cnti+1状态为j的计数、
- 关于lead和limit,可以放在数组下标,也可以在函数里特判
附上一个lead和limit在函数中特判的板子
#include<bits/stdc++.h>
#define ll long long
#define P 998244353
#define M 2005
using namespace std;
struct N{
ll x,y;
}dp[25][M];
ll pw[25],l,r;
int k,a[25],i,cnt;
N dfs(int p,int st,int lead,int limit){
if(!p) return __builtin_popcount(st)<=k&&!lead?N{1,0}:N{0,0};
if(!lead&&!limit&&dp[p][st].y!=-1)return dp[p][st];
N ans=N{0,0};
int end=(limit?a[p]:9);
for(int i=0;i<=end;i++){
N tp=dfs(p-1,lead&&!i?0:st|(1<<i),lead&&!i,limit&&i==end);
ans.x=(ans.x+tp.x)%P;
ans.y=(ans.y+tp.y+1ll*i*pw[p-1]%P*tp.x%P)%P;
}
if(!limit)dp[p][st]=ans;
return ans;
}
ll cal(ll x){
cnt=0;
while(x>0){a[++cnt]=x%10;x/=10;}
memset(dp,-1,sizeof(dp));
return dfs(cnt,0,1,1).y%P;
}
int main(){
pw[0]=1;
for(i=1;i<=20;i++)pw[i]=pw[i-1]*10%P;
cin>>l>>r>>k;
cout<<(cal(r)-cal(l-1)+P)%P;
}
Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum的更多相关文章
- Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum (数位dp求和)
题目链接:https://codeforces.com/contest/1073/problem/E 题目大意:给定一个区间[l,r],需要求出区间[l,r]内符合数位上的不同数字个数不超过k个的数的 ...
- Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)
这场比赛没有打,后来补了一下,第五题数位dp好不容易才搞出来(我太菜啊). 比赛传送门:http://codeforces.com/contest/1073 A. Diverse Substring ...
- Educational Codeforces Round 53 (Rated for Div. 2)
http://codeforces.com/contest/1073 A. Diverse Substring #include <bits/stdc++.h> using namespa ...
- [codeforces][Educational Codeforces Round 53 (Rated for Div. 2)D. Berland Fair]
http://codeforces.com/problemset/problem/1073/D 题目大意:有n个物品(n<2e5)围成一个圈,你有t(t<1e18)元,每次经过物品i,如果 ...
- Educational Codeforces Round 53 (Rated for Div. 2) C. Vasya and Robot 【二分 + 尺取】
任意门:http://codeforces.com/contest/1073/problem/C C. Vasya and Robot time limit per test 1 second mem ...
- Educational Codeforces Round 53 (Rated for Div. 2)G. Yet Another LCP Problem
题意:给串s,每次询问k个数a,l个数b,问a和b作为后缀的lcp的综合 题解:和bzoj3879类似,反向sam日神仙...lcp就是fail树上的lca.把点抠出来建虚树,然后在上面dp即可.(感 ...
- Educational Codeforces Round 53 (Rated for Div. 2) D. Berland Fair
题意:一个人 有T块钱 有一圈商店 分别出售 不同价格的东西 每次经过商店只能买一个 并且如果钱够就必须买 这个人一定是从1号店开始的!(比赛的时候读错了题,以为随意起点...)问可以买多少个 ...
- Educational Codeforces Round 53 (Rated for Div. 2) C. Vasya and Robot
题意:给出一段操作序列 和目的地 问修改(只可以更改 不可以删除或添加)该序列使得最后到达终点时 所进行的修改代价最小是多少 其中代价的定义是 终点序号-起点序号-1 思路:因为代价是终点序号减去 ...
- Educational Codeforces Round 53 (Rated for Div. 2) A Diverse Substring
传送门 https://www.cnblogs.com/violet-acmer/p/10163375.html 题意: 给出串是多态的定义“长度为 n 的串 s ,当串 s 中所有字母出现的次数严格 ...
随机推荐
- Mac电脑Dock栏开启放大特效
1 右击Dock栏空白处,选择启用放大 2 在Dock偏好设置中调整图标放大的倍数 3 滑动鼠标,查看放大效果
- 解决自定义classloader后无法使用maven install
@上篇博客中探讨了web项目利用自定义classloader进行解密,利用的是编译后的文件直接运行程序一切正常 今天博主在探讨加密后进行混淆时,打包程序报程序包org.apache.catalina. ...
- Java使用点滴
1.查找某个字符在字符串中第几次出现的位置 /** * 查找某个字符在字符串中第几次出现的位置 * @param string 要匹配的字符串 * @param i 第几次出现 * @param ch ...
- HR 常用事务代码
HR的键值权限查看: oosb 删除人员 : pu01 查看人员主数据:PA30 对人员进行入职.离职.调岗等基本操作:PA40 查看HR中的公式的意思:PE04 查看HR中的工资项:PE02 创建 ...
- centos7 二进制版本安装 mysql8.0.13
一.下载mysql二进制安装包 mysql官网: https://dev.mysql.com/downloads/mysql/ 由于国内网络问题,个人建议使用国内开源镜像站下载: http://mir ...
- python 基础数据类型 之 列表
列表:定义 和特性 列表定义和创建: 定义:[,]内以逗号分隔,按照索引,存放各种数据类型,一般没有限制,每个位置代表一个元素 range_create = list(range(0, 10))pri ...
- c# 关于取小数点后值四舍五入精度问题
---恢复内容开始--- 最近做一个校验码验证法算法的生成程序,涉及到取小数点后值的问题;对其中遇到的问题做一下总结: 1:ToString()转换时碰到0.9999999999999之类的数据,给自 ...
- android开发中一个activity如何调用另一个xml中的控件
有时候,我们需要在一个activity中使用另一个activity中的控件,这时候就不能直接findViewById,不然会报错指向空对象,这时就需要像下面这样做. LayoutInflater fa ...
- PAT 1081 检查密码(15) (代码+思路)
1081 检查密码(15 分) 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母也 ...
- spring boot (三): 热部署
介绍了Spring boot实现热部署的两种方式,这两种方法分别是使用 Spring Loaded和使用spring-boot-devtools进行热部署. 热部署是什么 大家都知道在项目开发过程中, ...