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 中所有字母出现的次数严格 ...
随机推荐
- Codeforces Beta Round #27 (Codeforces format, Div. 2)
Codeforces Beta Round #27 (Codeforces format, Div. 2) http://codeforces.com/contest/27 A #include< ...
- vue 添加子路由,并对路由重定向
// 用户信息首页 { path: '/user/index', name: 'userIndex', component: userIndex, redirect: '/user/index/sho ...
- redis 集群java.lang.NoSuchMethodError:SpringJAR包版本冲突错误解决方法
项目中出现如下错误,记录下解决方法: org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exce ...
- webpack(一) 安装使用 之css使用注意
在webpackDemo 文件夹中新建 style.css,index.html style.css 中将背景色设为红色. body{ background-color: red; } he'llWo ...
- java_3选择与循环
1.三种执行顺序(流程控制语句) 在Java中,有三种执行结构,第一种:顺序结构.第二种:循环结构.第三种:选择结构. 2.顺序结构 自上而下,顺序执行. 3.循环结构 (1)while语句 初始化表 ...
- java 向上转型和向下转型
学习向上转型和向下转型怎么用没多难,但是为什么那样用,我搞了很多次没弄明白.没弄明白的原因是平时学习时之看例子,而例子一般都比较简单,没有对象之间的调用,一般就是一个对象调用自己的方法. 首先看下怎么 ...
- subprocess.Popen在win10下会有异常
win10运行下 会报740错误 查了下搜索结果 是uac问题 但uac已经是关闭状态 后直接使用os.popen进行替换 运行ok
- migrantion
Enable-Migrations - ConfigurationTypeName namespace.DbContext Enable-Migrations命令创建了一个新的Migrations文件 ...
- [z] Git pull 强制覆盖本地文件
git fetch --all git reset --hard origin/master git pull git fetch 只是下载远程的库的内容,不做任何的合并 git reset 把HEA ...
- 更改AVD默认路径
默认情况下,安卓模拟器镜像文件会放到%userprofile%\.android下,例如当前Win7登录用户为administrator 则%userprofile%为 c:\users\admini ...