给出上下界,让你求出其中满足条件:不同的数字的数量不超过k个的数字的总和,答案模998244353,比如123里不同的数字个数为3,113里不同的数字个数为2,111里不同的数字个数为1。

跟普通的数位dp相比,这道题的不同在于是求总和,不是求数字的个数,但我们可以在求数字个数的基础上再进行求和,以下可以看代码注释。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<iomanip>
#include<cctype>
#include<ctime>
using namespace std;
typedef long long ll;
#define edl putchar('\n')
#define sscc ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define ROF(i,a,b) for(int i=a;i>=b;i--)
#define FORLL(i,a,b) for(ll i=a;i<=b;i++)
#define ROFLL(i,a,b) for(ll i=a;i>=b;i--)
#define mst(a) memset(a,0,sizeof(a))
#define mstn(a,n) memset(a,n,sizeof(a))
#define zero(x)(((x)>0?(x):-(x))<eps)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%lld",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
int month[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{1,1},{1,-1},{-1,1}};
const int MAXN=2e5+5;
const int INF=1<<30;
const long long mod=998244353;
const double eps=1e-8;
const ll inff=0x3f3f3f3f3f3f3f3f;
ll dp[25][1030][12];/*记录答案总和的数组*/
ll d[25][1030];/*记录答案个数的数组*/
ll t[25];/*10的幂次方,节省时间*/
int a[25];/*记录每一位数字*/
int f[25];/*2的幂次方,节省时间*/
int k[1030];/*状态压缩,记录某个状态有多少个不同的数字*/
int p;/*题目问的最大不同数量*/
struct num
{ll a,b;/*a对应d数组,b对应dp数组*/
}s;
num dfs(int pos,int now,int sta,int limit)
{if(pos==0){return (num){1,now};} if(!limit&&dp[pos][sta][now]!=-1){return (num){d[pos][sta],dp[pos][sta][now]};}int up=limit?a[pos]:9,g;ll ans=0,cnt=0;FOR(i,0,up){if(sta==0&&i==0)/*前导0的特殊判断*/ {s=dfs(pos-1,i,sta,limit&&i==up);cnt+=s.a;/*答案个数*/ans+=s.b;/*答案总和*/cnt%=mod;ans%=mod;}else{g=sta|f[i];if(k[g]<=p){s=dfs(pos-1,i,g,limit&&i==up);cnt+=s.a;/*答案个数*/ans+=s.b;/*答案总和*/cnt%=mod;ans%=mod;}}    }ans=(ans+cnt*t[pos]%mod*(ll)now%mod)%mod;if(!limit)d[pos][sta]=cnt,dp[pos][sta][now]=ans;return (num){cnt,ans};
}
ll solve(ll x)
{if(x==0) return 0;int pos=0;while(x){a[++pos]=x%10;x/=10;}a[pos+1]=0;return dfs(pos,0,0,1).b;
}
int main()
{ll n,m;f[0]=1,t[0]=1;FOR(i,1,18)f[i]=f[i-1]*2,t[i]=t[i-1]*10,t[i]%=mod;FOR(i,0,1024){int j=i,cnt=0;while(j){cnt+=j%2;j/=2;}k[i]=cnt;}FOR(i,0,20)FOR(j,0,1024){d[i][j]=-1;FOR(I,0,9)dp[i][j][I]=-1;}//scanf("%d",&T);//while(1){scanf("%lld%lld%d",&n,&m,&p);n=solve(n-1);m=solve(m);printf("%lld\n",(m-n+mod)%mod);}return 0;
}

  

转载于:https://www.cnblogs.com/qq936584671/p/9889829.html

数位dp:Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum相关推荐

  1. Educational Codeforces Round 108 (Rated for Div. 2) D. Maximum Sum of Products 思维 + dp

    传送门 文章目录 题意: 思路: 题意: 给你两个长度为nnn的数组a,ba,ba,b,你可以至多反转一段连续区间,求∑i=1nai∗bi\sum _{i=1}^n a_i*b_i∑i=1n​ai​∗ ...

  2. 贪心 ---- Educational Codeforces Round 90 (Rated for Div. 2)D Maximum Sum on Even Positions[偶数子段最大和]

    题目链接 题目大意:给你一个序列你可以选择一个连续的子段将其反转,反转后使得偶数位置上的数字和最大 1.很明显我们可以看出反转的字符串的长度一定是偶数的,因为是奇数的话偶数位还是在偶数位不变所以没有用 ...

  3. Educational Codeforces Round 103 (Rated for Div. 2)A~E解题报告

    Educational Codeforces Round 103 (Rated for Div. 2) A. K-divisible Sum 原题信息 解题思路 AC代码 #include <b ...

  4. Educational Codeforces Round 111 (Rated for Div. 2) E. Stringforces 二分 + 状压dp

    传送门 文章目录 题意: 思路: 题意: 给你一个串,只包含前kkk个字母和???,定义fif_ifi​表示第iii个字母在串中出现的最长连续长度,你现在需要将???替换为前kkk个字母,使得mini ...

  5. Educational Codeforces Round 73 (Rated for Div. 2) Make The Fence Great Again dp + 结论

    传送门 文章目录 题意: 思路: 题意: 思路: 首先证明一个结论:一个数最多被加两次. 首先假设a[i]=a[i−1]a[i]=a[i-1]a[i]=a[i−1]或a[i]=a[i+1]a[i]=a ...

  6. Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...

  7. Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)

    Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况: a==c/ba == c / ba==c/b这个时候两 ...

  8. Educational Codeforces Round 114 (Rated for Div. 2) D. The Strongest Build 暴力 + bfs

    传送门 文章目录 题意: 思路: 题意: 你有nnn个装备槽,每个槽里面有cic_ici​个力量加成,对于每个槽只能选一个力量加成,现在给你mmm个力量组合[b1,b2,...,bn][b_1,b_2 ...

  9. Educational Codeforces Round 72 (Rated for Div. 2) D. Coloring Edges dfs树/拓扑找环

    传送门 文章目录 题意: 思路: 题意: 给你一张图,你需要给这个图的边染色,保证如果有环那么这个环内边的颜色不全相同,输出染色方案和用的颜色个数. n,m≤5e3n,m\le5e3n,m≤5e3 思 ...

最新文章

  1. 【报告下载】想要评测 Kylin和Vertica的性能?这份基准测试白皮书已经替你做到了...
  2. 华为fussioncompute上添加nexentastor作为IPSAN
  3. 计算机组成原理实验 组装实验报告,计算机组成原理实验一实验报告..doc
  4. win7 其他用户当前已登录到此计算机,win7旗舰版的电脑如何切换至公共用户?-win7用户,win7账户已被停用按f8没反应...
  5. 学以致用十-----centos7.2+python3.6+vim8.1+YouCompleteMe
  6. 杭电4535吉哥系列故事——礼尚往来
  7. Windows下的git配置
  8. CRC全套~~~ 转载
  9. 转移 AD Time Server
  10. CAN通讯进阶-基于Python使用dbc文件解析CAN数据(dbc文件的创建、使用方法)
  11. ioncube linux,lamp安装版,安装ionCube不成功
  12. Office操作技巧——利用Excel实现文件夹批量重命名
  13. Apache解析漏洞
  14. Python 图算法系列2 -电影推荐
  15. Tmall_1天猫商城中的重要业务及实现代码
  16. Css3实现背景毛玻璃效果
  17. STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读
  18. SpringCloud_Dubbo_JZZ_MBY
  19. 宋鸿兵 - 货币战争5(2014年3月20日)
  20. C语言关于指针知识点总结【2】

热门文章

  1. TCP负载均衡地址转换(锐捷设备)
  2. 虚拟化帮您打造绿色数据中心
  3. 【工具类】页面静态化 --- Freemarker的使用
  4. 【坑爹微信】微信JSSDK图片上传问题和解决
  5. learning hdmi edid protocol
  6. OpenGL学习笔记(2) 画一个正方形
  7. 统计寄存器AX中1 的个数
  8. 【Codeforces Round #430 (Div. 2) D】Vitya and Strange Lesson
  9. vue1与vue2的路由 以及vue2项目大概了解
  10. HashMap负载因子