CF1073E Segment Sum 解题报告
CF1073E Segment Sum
题意翻译
给定\(K,L,R\),求\(L~R\)之间最多不包含超过\(K\)个数码的数的和。
\(K\le 10,L,R\le 10^{18}\)
数位dp
\(dp_{i,s}\)前\(i\)位出现集合\(s\)的贡献和和出现次数
然后记忆化的时候转移一下就行了
然而写的时候还是怪麻烦的
Code:
#include <cstdio>
#include <cstring>
#define ll long long
const int mod=998244353;
inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
#define mul(a,b) (1ll*(a)*(b)%mod)
int po[20],bit[20],len,k;
struct node
{
int val,cnt;
node(){}
node(int v,int c){val=v,cnt=c;}
node friend operator +(node a,node b){return node(add(a.val,b.val),add(a.cnt,b.cnt));}
}dp[20][1<<10];
node dfs(int pos,int sta,int lead,int lim)//前导0和最高位限制
{
int cnt=0;
for(int i=0;i<10;i++) cnt+=sta>>i&1;
if(cnt>pos) return node(0,0);
if(!pos) return node(0,1);
if(!lim&&!lead&&~dp[pos][sta].val) return dp[pos][sta];
node ret=node(0,0),bee;
if(lead) ret=ret+dfs(pos-1,sta,lead,lim&&!bit[pos]);
else if(sta&1) ret=ret+dfs(pos-1,sta,lead,lim&&!bit[pos])+dfs(pos-1,sta^1,lead,lim&&!bit[pos]);
for(int i=1,up=lim?bit[pos]:9;i<=up;i++)
if(sta>>i&1)
{
bee=dfs(pos-1,sta,0,lim&&i==up)+dfs(pos-1,sta^(1<<i),0,lim&&i==up);
ret=ret+bee;
ret.val=add(ret.val,mul(bee.cnt,mul(i,po[pos-1])));
}
return !lim&&!lead?dp[pos][sta]=ret:ret;
}
int cal(ll x)
{
len=0;while(x) bit[++len]=x%10,x/=10;
memset(dp,-1,sizeof dp);int ans=0;
for(int s=0;s<1<<10;s++)
{
int cnt=0;
for(int i=0;i<10;i++) cnt+=s>>i&1;
if(cnt<=k) ans=add(ans,dfs(len,s,1,1).val);
}
return ans;
}
int main()
{
ll l,r;
scanf("%lld%lld%d",&l,&r,&k);
po[0]=1;for(int i=1;i<=18;i++) po[i]=mul(po[i-1],10);
printf("%d\n",add(cal(r),mod-cal(l-1)));
return 0;
}
2019.2.9
CF1073E Segment Sum 解题报告的更多相关文章
- LeetCode 2 Add Two Sum 解题报告
LeetCode 2 Add Two Sum 解题报告 LeetCode第二题 Add Two Sum 首先我们看题目要求: You are given two linked lists repres ...
- LeetCode 1 Two Sum 解题报告
LeetCode 1 Two Sum 解题报告 偶然间听见leetcode这个平台,这里面题量也不是很多200多题,打算平时有空在研究生期间就刷完,跟跟多的练习算法的人进行交流思想,一定的ACM算法积 ...
- CF1073E Segment Sum 自闭了
CF1073E Segment Sum 题意翻译 给定\(K,L,R\),求\(L\)~\(R\)之间最多不包含超过\(K\)个数码的数的和. \(K<=10,L,R<=1e18\) 我 ...
- LeetCode: Combination Sum 解题报告
Combination Sum Combination Sum Total Accepted: 25850 Total Submissions: 96391 My Submissions Questi ...
- USACO Section2.3 Zero Sum 解题报告 【icedream61】
zerosum解题报告----------------------------------------------------------------------------------------- ...
- 【LeetCode】124. Binary Tree Maximum Path Sum 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcode ...
- 【LeetCode】548. Split Array with Equal Sum 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力 日期 题目地址:https://leetcode ...
- 【LeetCode】339. Nested List Weight Sum 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 dfs 日期 题目地址:https://leetcod ...
- 【LeetCode】1020. Partition Array Into Three Parts With Equal Sum 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
随机推荐
- 手机H5移动端WEB资源整合之meta标签
一.相关网站使用meta的实例 youku首页的Meta设置: <meta charset="utf-8"> <meta http-equiv="X-U ...
- NTP服务部署和测试
1. 概述2. 部署3. 配置4. 客户端配置4.1 客户端安装ntpdate4.2 同步设置 1. 概述 本篇博客主要记录如何部署一台NTP服务器,用于内网时间同步. 时间服务器对于集群内部节点之间 ...
- Python_装饰器_29
# 装饰器形成的过程 : 最简单的装饰器 有返回值的 有一个参数 万能参数 # 装饰器的作用 # 原则 :开放封闭原则 # 语法糖 :@ # 装饰器的固定模式 import time # print( ...
- Notes of Daily Scrum Meeting(12.23)
今天的团队任务总结如下: 团队成员 今日团队工作 陈少杰 调试网络连接,寻找新的连接方法 王迪 建立搜索的UI界面 金鑫 查阅相关资料,熟悉后台的接口 雷元勇 建立搜索的界面 高孟烨 继续美化界面,熟 ...
- javac编译提示错误需要为 class、interface 或 enum
HelloWorld.java:1: 需要为 class.interface 或 enum锘缝ublic class HelloWorld{^1 错误 这个错误出现的原因主要是在中文操作系统中,使用一 ...
- [福大软工] Z班——Alpha现场答辩情况汇总
Alpha现场答辩 小组互评(文字版) 各组对于 麻瓜制造者 的评价与建议 队伍名 评价与建议 *** 界面较友好,安全性不足,功能基本完整.希望能留下卖家的联系方式而不是在APP上直接联系,APP上 ...
- ios开发之--CAKeyframeAnimation的详细用法
简单的创建一个带路径的动画效果,比较粗糙,不过事先原理都是一样的, 代码如下: 1,创建动画所需的view -(void)creatView { moveView = [UIView new]; mo ...
- MySQL基础知识——范式与事务
几个概念 在说范式之前,要先了解几个概念: 关系模式 关系模式的5要素:R(U,D,DOM,F) 用下面这个category表来理解上面这个式子 mysql> desc student; +-- ...
- linux_目录基本操作
ls命令 ls命令用来显示目标列表,在Linux中是使用率较高的命令.ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件. 语法 $ ls [选项] [目录] 选项 说明 -a 显示所有档案 ...
- children()与find()区别
1.children() 返回被选元素的所有直接子元素,该方法只会向下一级对 DOM 树进行遍历: 2.find() 返回被选元素的后代元素,一路向下直到最后一个后代.