CF1073E Segment Sum
数位DP,求[L,R]区间内所有"数字内包含的不同数码不超过k个的数字"之和.在状态上加一维状态压缩表示含有的数码集合.一开始读错题以为是求数字的个数.读对题之后调了一会儿.
#include<cstdio>
typedef long long ll;
const int mod=998244353;
int cnt1[1024];
int f[20][1024],g[20][1024];
int F[20][1024],G[20][1024];
int p10[20];
void init(){
p10[0]=1;
for(int i=1;i<20;++i)p10[i]=p10[i-1]*10ll%mod;
cnt1[0]=0;
for(int i=1;i<1024;++i)cnt1[i]=cnt1[i>>1]+(i&1);
for(int i=0;i<10;++i)f[1][1<<i]=1,g[1][1<<i]=1,F[1][1<<i]=i,G[1][1<<i]=i;
g[0][0]=1;
for(int i=2;i<=18;++i){
for(int k=0;k<1024;++k){
for(int j=0;j<10;++j){
g[i][k|(1<<j)]=(g[i][k|(1<<j)]+g[i-1][k])%mod;
G[i][k|(1<<j)]=(G[i][k|(1<<j)]+G[i-1][k])%mod;
G[i][k|(1<<j)]=(G[i][k|(1<<j)]+g[i-1][k]*1ll*j%mod*p10[i-1]%mod)%mod;
}
for(int j=1;j<10;++j){
f[i][k|(1<<j)]=(f[i][k|(1<<j)]+g[i-1][k])%mod;
F[i][k|(1<<j)]=(F[i][k|(1<<j)]+G[i-1][k])%mod;
F[i][k|(1<<j)]=(F[i][k|(1<<j)]+g[i-1][k]*1ll*j%mod*p10[i-1]%mod)%mod;
}
}
}
}
int calc(ll lim,int c){//strictly less than lim
if(lim==(ll)(1e18)){
int ans=0;
for(int i=1;i<=18;++i){
for(int k=0;k<1024;++k){
if(cnt1[k]<=c)ans=(ans+F[i][k])%mod;
}
}
return ans;
}
int L[20],n=0;
while(lim){
L[++n]=lim%10;lim/=10;
}
int S=0;
int ans=0;
for(int i=1;i<=n-1;++i){
for(int k=0;k<1024;++k){
if(cnt1[k]<=c)ans=(ans+F[i][k])%mod;
}
}
int presum=0;
for(int i=n;i>=1;--i){
int lo=(i==n)?1:0;
for(int j=L[i]-1;j>=lo;--j){
int tmp=(1<<j)|S;
for(int k=0;k<1024;++k){
if(cnt1[tmp|k]<=c){
ans=(ans+g[i-1][k]*1ll*(presum*10ll+j)%mod*p10[i-1]%mod+G[i-1][k])%mod;
}
}
}
S|=(1<<L[i]);
presum=(presum*10ll+L[i])%mod;
}
return ans;
}
int main(){
init();
ll L,R;
int k;
scanf("%lld%lld%d",&L,&R,&k);
printf("%d\n",(calc(R+1,k)-calc(L,k)+mod)%mod);
return 0;
}
CF1073E Segment Sum的更多相关文章
- CF1073E Segment Sum 解题报告
CF1073E Segment Sum 题意翻译 给定\(K,L,R\),求\(L~R\)之间最多不包含超过\(K\)个数码的数的和. \(K\le 10,L,R\le 10^{18}\) 数位dp ...
- CF1073E Segment Sum 自闭了
CF1073E Segment Sum 题意翻译 给定\(K,L,R\),求\(L\)~\(R\)之间最多不包含超过\(K\)个数码的数的和. \(K<=10,L,R<=1e18\) 我 ...
- Codeforces 1073 E - Segment Sum
E - Segment Sum 思路: 数位dp 我们平时做的数位dp都是求满足条件的数的个数, 这里要求满足条件的数的和 只要在原来的基础上求每一位的贡献就可以了,所以传参数时要传两个 代码: #p ...
- Educational Codeforces Round 53 E. Segment Sum(数位DP)
Educational Codeforces Round 53 E. Segment Sum 题意: 问[L,R]区间内有多少个数满足:其由不超过k种数字构成. 思路: 数位DP裸题,也比较好想.由于 ...
- CodeForces - 1073E :Segment Sum (数位DP)
You are given two integers l l and r r (l≤r l≤r ). Your task is to calculate the sum of numbers from ...
- E. Segment Sum(数位dp)
题意:求一个区间内满足所有数位不同数字个数小于K的数字总和.比如:k=2 1,2,3所有数位的不同数字的个数为1满足,但是123数位上有三个不同的数字,即123不满足. 我们可以使用一个二进制的数 ...
- Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum
https://codeforces.com/contest/1073/problem/E 题意 求出l到r之间的符合要求的数之和,结果取模998244353 要求:组成数的数位所用的数字种类不超过k ...
- CF 1073 E. Segment Sum
https://codeforces.com/problemset/problem/1073/E 题意:[l,r]中,出现0—9数字的种类数不超过k的数的和 dp[i][j][0/1] 表示 dfs到 ...
- Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum (数位dp求和)
题目链接:https://codeforces.com/contest/1073/problem/E 题目大意:给定一个区间[l,r],需要求出区间[l,r]内符合数位上的不同数字个数不超过k个的数的 ...
随机推荐
- 【转】常见的Web实时消息交互方式和SignalR
https://www.cnblogs.com/Wddpct/p/5650015.html 前言 1. Web消息交互技术1.1 常见技术1.2 WebSocket介绍1.3 WebSocket示例 ...
- #HTTP协议学习# (一)request 和response 解析
注:本文转自:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html , 粉字[]内内容为个人笔记 当今web程序的开发技术真是 ...
- excel的宏与VBA入门(二)——数据类型与变量
一.属性与方法 1.属性 上面单击对象,下面即显示对应的属性: 2.方法 双击左上的对象,即可看到相应的方法: 二.数据类型 到 Boolean True 或 False , 到 , ,,, 到 ,, ...
- Android病毒家族及行为(一)
1病毒名称:a.remote.GingerMaste中文名:病毒家族:GingerMast病毒类别:远程控制恶意行为:获取root权限,同时连接远端服务器,在其指令控制下静默下载其它恶意软件,给用户手 ...
- 20155226 Exp2 后门原理与实践
20155226 Exp2 后门原理与实践 第一次实验博客交了蓝墨云未在博客园提交,链接 1.Windows获得Linux Shell 在windows下,打开CMD,使用ipconfig指令查看本机 ...
- 3.RapidIO串行物理层的包传输过程
转自https://www.cnblogs.com/liujinggang/p/10005431.html 一.引言 前几篇文章已经谈到RapidIO的协议,串行物理层与控制符号. RapidIO协议 ...
- 上google的方法
最近Google又被墙了....哎,纠结..... 说实话,咱都是良民,爱党爱国,真心不想干啥,只想查点资料的,输入google都上不去了. 方法: 1. FQ.很麻烦,有时候改来改去也容易出错,速度 ...
- libgdx学习记录15——音乐Music播放
背景音乐是游戏中必备的元素,好的背景音乐能为游戏加分不少,使人更容易融入到游戏的氛围中去. Music类中主要有以下函数: play()播放 stop()停止 pause()暂停 setVolume( ...
- centos7 部署mysql-5.7.20
一.系统环境 系统:CentOS Linux release 7.5 mysqlb进制包:mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz 1)依赖包安装 yum ...
- LintCode——合并排序数组II
描述:合并两个排序的整数数组A和B变成一个新的数组 样例:给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6] 1.Python:先将数组B加到数组A之后,然后 ...