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 中所有字母出现的次数严格 ...
随机推荐
- 对arm裸板调试的理解
由于arm芯片一般都包含的由jtag调试这项功能,cpu向外部发出信号时,一般都要同jtag发送出去,它就像一个路口的交警一样,能够控制车辆的运行,当然在arm中指的是cpu发出的数据和地址,我们在调 ...
- kraken-ejs创建一个项目【学习札记】
Keep in Touch. 保持联络. Who’s calling? 是哪一位? You did right. 你做得对. You set me up! 你出卖我! kraken-express-e ...
- java bean validation 参数验证
一.前言 二.几种解决方案 三.使用bean validation 自带的注解验证 四.自定义bean validation 注解验证 一.前言 在后台开发过程中,对参数的校验成为开发环境不可缺少的一 ...
- [leetcode]127. Word Ladder单词接龙
Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest t ...
- AngularJS——第9章 模块加载
第9章 模块加载 AngularJS模块可以在被加载和执行之前对其自身进行配置.我们可以在应用的加载阶段配置不同的逻辑. [AngularJS执行流程] 启动阶段(startup) 开始 --> ...
- C#中泛型的解释(object,list,var,dynamic的区别)
泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能.泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的 ...
- Django中使用django_debug_toolbar
一 概述 django_debug_toolbar 是django的第三方工具包,给django扩展了调试功能. 包括查看执行的sql语句,db查询次数,request,headers,调试概览等. ...
- JFinal Web开发学习(七)使用layUI美化的登录功能
效果: 验证码还是没有布局好.背景比较怀古. 1.写前端html login.jsp <!DOCTYPE html> <html> <head> <meta ...
- vue的通讯与传递props emit (简单的弹框组件)
props父把信息传递给子组件 1父组件 <template> <div class="hello"> <div id="app-3&quo ...
- JavaScript 字符串用于存储和处理文本
JavaScript 字符串用于存储和处理文本 var string_value='dasfsdfsd'; 注意:字符串利用索引精确定位取值 var character=string_value[7] ...