数位dp:Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum
给出上下界,让你求出其中满足条件:不同的数字的数量不超过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相关推荐
- 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=1nai∗ ...
- 贪心 ---- Educational Codeforces Round 90 (Rated for Div. 2)D Maximum Sum on Even Positions[偶数子段最大和]
题目链接 题目大意:给你一个序列你可以选择一个连续的子段将其反转,反转后使得偶数位置上的数字和最大 1.很明显我们可以看出反转的字符串的长度一定是偶数的,因为是奇数的话偶数位还是在偶数位不变所以没有用 ...
- 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 ...
- Educational Codeforces Round 111 (Rated for Div. 2) E. Stringforces 二分 + 状压dp
传送门 文章目录 题意: 思路: 题意: 给你一个串,只包含前kkk个字母和???,定义fif_ifi表示第iii个字母在串中出现的最长连续长度,你现在需要将???替换为前kkk个字母,使得mini ...
- 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 ...
- Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...
- 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这个时候两 ...
- Educational Codeforces Round 114 (Rated for Div. 2) D. The Strongest Build 暴力 + bfs
传送门 文章目录 题意: 思路: 题意: 你有nnn个装备槽,每个槽里面有cic_ici个力量加成,对于每个槽只能选一个力量加成,现在给你mmm个力量组合[b1,b2,...,bn][b_1,b_2 ...
- Educational Codeforces Round 72 (Rated for Div. 2) D. Coloring Edges dfs树/拓扑找环
传送门 文章目录 题意: 思路: 题意: 给你一张图,你需要给这个图的边染色,保证如果有环那么这个环内边的颜色不全相同,输出染色方案和用的颜色个数. n,m≤5e3n,m\le5e3n,m≤5e3 思 ...
最新文章
- 【报告下载】想要评测 Kylin和Vertica的性能?这份基准测试白皮书已经替你做到了...
- 华为fussioncompute上添加nexentastor作为IPSAN
- 计算机组成原理实验 组装实验报告,计算机组成原理实验一实验报告..doc
- win7 其他用户当前已登录到此计算机,win7旗舰版的电脑如何切换至公共用户?-win7用户,win7账户已被停用按f8没反应...
- 学以致用十-----centos7.2+python3.6+vim8.1+YouCompleteMe
- 杭电4535吉哥系列故事——礼尚往来
- Windows下的git配置
- CRC全套~~~ 转载
- 转移 AD Time Server
- CAN通讯进阶-基于Python使用dbc文件解析CAN数据(dbc文件的创建、使用方法)
- ioncube linux,lamp安装版,安装ionCube不成功
- Office操作技巧——利用Excel实现文件夹批量重命名
- Apache解析漏洞
- Python 图算法系列2 -电影推荐
- Tmall_1天猫商城中的重要业务及实现代码
- Css3实现背景毛玻璃效果
- STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读
- SpringCloud_Dubbo_JZZ_MBY
- 宋鸿兵 - 货币战争5(2014年3月20日)
- C语言关于指针知识点总结【2】