CF1073E Segment Sum 自闭了
CF1073E Segment Sum
题意翻译
给定\(K,L,R\),求\(L\)~\(R\)之间最多不包含超过\(K\)个数码的数的和。
\(K<=10,L,R<=1e18\)
我 写 晕 了
我 自 闭 了


根本不知道自己在写什么????
告辞。。。
错误Code:
#include <cstdio>
#define ll long long
const ll mod=998244353;
ll dp[2][20][1<<10],cnt[2][20][1<<10],po[20],l,r;
int k;
void init()
{
po[0]=1;
for(int i=1;i<=18;i++) po[i]=po[i-1]*10%mod;
cnt[0][0][0]=1;
for(int i=1;i<=18;i++)
for(int s=0;s<1<<10;s++)
{
for(int j=1;j<=9;j++)
if(s>>j&1)
{
int t=(1<<j)^s;
(cnt[1][i][s]+=(cnt[0][i-1][s]+cnt[1][i-1][s]
+cnt[0][i-1][t]+cnt[1][i-1][t]))%=mod;
}
int t=s^1;
if(s&1)
(cnt[0][i][s]+=(cnt[0][i-1][s]+cnt[1][i-1][s]
+cnt[0][i-1][t]+cnt[1][i-1][t]))%=mod;
}
for(int i=1;i<=18;i++)
for(int s=0;s<1<<10;s++)
{
for(int j=1;j<=9;j++)
if(s>>j&1)
{
int t=(1<<j)^s;
ll tmp0=(cnt[0][i-1][s]+cnt[1][i-1][s]
+cnt[0][i-1][t]+cnt[1][i-1][t])%mod;
ll tmp1=(dp[0][i-1][s]+dp[1][i-1][s]
+dp[0][i-1][t]+dp[1][i-1][t])%mod;
(dp[1][i][s]+=(tmp1+j*po[i-1]%mod*tmp0))%=mod;
}
if(s&1)
{
int t=s^1;
ll tmp1=(dp[0][i-1][s]+dp[1][i-1][s]
+dp[0][i-1][t]+dp[1][i-1][t])%mod;
dp[0][i][s]=tmp1;
}
}
}
int bit[20];
ll solve(ll d)
{
int rt=0;
for(ll i=d;i;i/=10) bit[++rt]=i%10;
int cho=0;//高位已选状态
ll res=0,ans=0;//高位剩余
for(int i=rt;i;i--)
{
for(int s=0;s<1<<10;s++)
{
int ct=0;
for(int t=s;t;t>>=1) ct+=t&1;
if(ct>k+1) continue;
if(s&1)
{
int t=s^1;
ll tmp1=(dp[0][i-1][s]+dp[1][i-1][s]
+dp[0][i-1][t]+dp[1][i-1][t])%mod;
ans+=tmp1;
}
if(ct>k) continue;
for(int j=1;j<bit[i]+(i==1);j++)//高位选填
if((s>>j&1)&&((s|cho)==s))
{
int t=(1<<j)^s;
ll tmp0=(cnt[0][i-1][s]+cnt[1][i-1][s]
+cnt[0][i-1][t]+cnt[1][i-1][t])%mod;
ll tmp1=(dp[0][i-1][s]+dp[1][i-1][s]
+dp[0][i-1][t]+dp[1][i-1][t])%mod;
(ans+=tmp1+tmp0*(j+res)%mod*po[i-1]%mod)%=mod;
}
}
res=(res+bit[i])*10%mod;
cho|=1<<bit[i];
}
return ans;
}
int main()
{
scanf("%lld%lld%d",&l,&r,&k);
init();
printf("%lld\n",((solve(r)-solve(l-1))%mod+mod)%mod);
return 0;
}
updata2019.2.9
写了好几个月,终于肝出来了
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;
}
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
数位DP,求[L,R]区间内所有"数字内包含的不同数码不超过k个的数字"之和.在状态上加一维状态压缩表示含有的数码集合.一开始读错题以为是求数字的个数.读对题之后调了一会儿. #i ...
- 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个的数的 ...
随机推荐
- 第五篇 Flask组件之SQLAchemy及Flask-SQLAlchemy插件/Flask-Script/Flask-migrate/pipreqs模块
SQLAlchemy组件 一. 介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然 ...
- 本地矩阵(Local Matrix)
本地矩阵具有整型的行.列索引值和双精度浮点型的元素值,它存储在单机上.MLlib支持稠密矩阵DenseMatrix和稀疏矩阵Sparse Matrix两种本地矩阵,稠密矩阵将所有元素的值存储在一个列优 ...
- appium启动APP配置参数:
一.Android启动app python启动脚本如下: from appium import webdriver desired_caps = {} desired_caps['plat ...
- 【shell 每日一练6】初始化安装Mysql并修改密码
一.简单实现mysql一键安装 参考:[第二章]MySQL数据库基于Centos7.3-部署 此脚本前提条件是防火墙,selinux都已经设置完毕: [root@web130 ~]# cat Inst ...
- numpy切片和布尔型索引
numpy 标签(空格分隔): numpy 数据挖掘 切片 数组切片是原始数组的视图.这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上 In [16]: arr Out[16]: arr ...
- java一些面试题
java虚拟机 什么时候会触发full gc System.gc()方法的调用 老年代空间不足 永生区空间不足(JVM规范中运行时数据区域中的方法区,在HotSpot虚拟机中又被习惯称为永生代或者永生 ...
- Spring MVC 整合Swagger的一些问题总结
在做Spring MVC 整合swagger的时候,遇到的两个问题: 第一个问题 在网上找了一些Spring MVC 和Swagger的例子,照着一步步的配置,结果,到最后,项目都起来了,没有任何问题 ...
- jquery datatable 常用例子
在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简 ...
- qwe
这次作业我负责的部分是把爬取完的聊天记录经行数据挖掘以及经行各种普通过滤高级过滤等. 运行截图如下: 数据分为四部分:账户名.qq/邮箱.包含关键词的发言次数.包含关键词的发言字数. 遇到的困难及解决 ...
- 《学习OpenCV》课后习题解答5
题目:(P104) 为一个图像创建多个图像头.读取一个大小至少为100*100的图像.另创建两个图像头并设置它们的origion,depth,nChannels和widthStep属性同之前读取的图像 ...