CF 1073 E. Segment Sum
https://codeforces.com/problemset/problem/1073/E
题意:[l,r]中,出现0—9数字的种类数不超过k的数的和
dp[i][j][0/1] 表示 dfs到第i位以后,数字出现的情况状态为j能转移的状态,是否有上界限制的数字的和
f[i][j] 表示 dfs到第i位以后,数字出现的情况状态为j能转移的状态,没有上界限制的数字的个数
枚举这一位填什么
加上这一位的贡献,加上填上这一位之后后面数的贡献
数字出现状态:若i出现过,则状态j的第i位二进制位为1
#include<cstdio>
#include<cstring> using namespace std; typedef long long LL; const int mod=; int dp[][(<<)+][],f[][(<<)+];
int ans,m;
int a[],pow10[];
bool va[(<<)+]; int k; LL dfs(int dep,int s,int lim,bool zero)
{
if(!va[s]) return ;
if(!lim && f[dep][s]!=-) return f[dep][s];
if(!dep) return ;
int up=lim ? a[dep] : ,nl,news,tmp;
int sum=;
for(int i=;i<=up;++i)
{
if(zero && !i) news=;
else news=s|<<i;
nl=lim && a[dep]==i;
tmp=dfs(dep-,news,nl,zero && !i);
dp[dep][s][lim]+=1ll*tmp*i%mod*pow10[dep-]%mod;
dp[dep][s][lim]%=mod;
dp[dep][s][lim]+=dp[dep-][news][nl];
dp[dep][s][lim]%=mod;
sum+=tmp;
sum%=mod;
}
if(!lim) f[dep][s]=sum;
return sum;
} void solve(long long n,int ty)
{
int len=;
while(n) a[++len]=n%,n/=;
memset(f,-,sizeof(f));
memset(dp,,sizeof(dp));
dfs(len,,,);
ans+=ty*dp[len][][];
ans%=mod;
if(ans<) ans+=mod;
} bool check(int s)
{
int p=;
for(int i=;i<=;++i)
if(s&<<i) p++;
if(p<=k) return ;
else return ;
} int main()
{
LL l,r;
scanf("%lld%lld%d",&l,&r,&k);
pow10[]=;
for(int i=;i<;++i) pow10[i]=1ll*pow10[i-]*%mod;
m=<<;
for(int i=;i<m;++i) va[i]=check(i);
solve(r,);
solve(l-,-);
printf("%d",ans);
}
CF 1073 E. Segment Sum的更多相关文章
- Codeforces 1073 E - Segment Sum
E - Segment Sum 思路: 数位dp 我们平时做的数位dp都是求满足条件的数的个数, 这里要求满足条件的数的和 只要在原来的基础上求每一位的贡献就可以了,所以传参数时要传两个 代码: #p ...
- 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\) 我 ...
- Educational Codeforces Round 53 E. Segment Sum(数位DP)
Educational Codeforces Round 53 E. Segment Sum 题意: 问[L,R]区间内有多少个数满足:其由不超过k种数字构成. 思路: 数位DP裸题,也比较好想.由于 ...
- Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum
https://codeforces.com/contest/1073/problem/E 题意 求出l到r之间的符合要求的数之和,结果取模998244353 要求:组成数的数位所用的数字种类不超过k ...
- 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 ...
- Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum (数位dp求和)
题目链接:https://codeforces.com/contest/1073/problem/E 题目大意:给定一个区间[l,r],需要求出区间[l,r]内符合数位上的不同数字个数不超过k个的数的 ...
- E. Segment Sum(数位dp)
题意:求一个区间内满足所有数位不同数字个数小于K的数字总和.比如:k=2 1,2,3所有数位的不同数字的个数为1满足,但是123数位上有三个不同的数字,即123不满足. 我们可以使用一个二进制的数 ...
- CF 910 C. Minimum Sum
链接 [http://codeforces.com/group/1EzrFFyOc0/contest/910/problem/C] 题意 给你n个字符串,每个字符串的字符是a~j,每个字符都可以是0~ ...
随机推荐
- C语言当中int,float,double,char这四个有什么区别?
区别在以下方面: 一.定义方面: 1.int为整数型,用于定义整数类型的数据 . 2.float为单精度浮点型,能准确到小数点后六位 . 3.double为双精度浮点型,能准确到小数点都十二位 . 4 ...
- js将后台传入得时间格式化
//格式化时间函数Date.prototype.Format = function (fmt) { var o = { "M+": this.getMonth() + 1, //月 ...
- Docker 上安装、启动 MySQL
在docker仓库中搜索mysql的镜像: docker search mysql ; 下载镜像,这里我们安装 5.7 版本 docker pull mysql:[TAG]; 不写TAG默认拉取最新版 ...
- django 项目发布(centos 6.5 + python 3.5 + django1.9.8 + paramiko 2.0.2 + gunicorn )
环境 os centos 6.5 64bit python 3.5 django 1.9.8 paramiko 2.0.2 gunicorn 19.6.0 安装 centos install pyth ...
- WinForm程序打包教程
准备工作 1. 编写完成的WinForm程序 2. 安装部署项 VS2010中有一个自带的安装部署项目,叫:Visual Studio Installer ,通常称为:setup项目,是一个用于自定义 ...
- 位运算(&、|、^、~、>>、<<)
1.位运算概述 从现代计算机中所有的数据二进制的形式存储在设备中.即0.1两种状态,计算机对二进制数据进行的运算(+.-.*./)都是叫位运算,即将符号位共同参与运算的运算. 口说无凭,举一个简单的例 ...
- TM1638控制
原理图图纸: 显示控制与读按键与寄存器的对应 驱动代码:码云:
- jquery Ajax标准规范写法
$.ajax({ url:"http://www.xxx",//请求的url地址 dataType:"json",//返回的格式为json async:true ...
- Spring Bean 有关的那些注解
尊重原著直接贴链接 https://mp.weixin.qq.com/s/7lhpEo73KG3-xPgbFiaLHw
- ubuntu 18.04中nginx不能访问软链接目录中的内容
解决办法:以root权限运行nginx,即修改/etc/nginx/nginx.conf中的user www-data为root