HYSBZ - 1799

题意:给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数。

思路:数位dp,比较容易想到是数位dp,关键是dp式比较难想到,数位dp说到底是一个记忆化搜索的过程,dp式是一个记忆数组,对于一类数来说,对应了一个dp式,并且他们的答案是一样的,那么可以通过只对一个经行搜索然后得到全部的答案,这其实就是一个状态,这个状态首先要保证与其他状态没有交集,并且要保证状态数不能过多,否则记忆化效果不好,比如1e18个数用1e5个状态来表示显然可以大大降低复杂度,时间上是没有问题的,但是如果状态答道了1e15就是一个非常糟糕的状态表示了,这个题的难点就是找状态,dp[pos][sum][v],第一维表示数位不用说,第二维表示前pos位的数位和,v表示这个数%mod的值,这个mod是枚举的,从1-162枚举, 比如 123xxxx枚举mod=5对应的dp式为dp[4][6][123%5],显然对于前3位和为6并且模的结果为3的状态的所有数来说答案是一样的,这里有一点,这里说的”答案“ 是指前几位已经确定,后面几位不确定,但是由已确定的前几位可以推出后面几位不确定的所有情况中可行的情况,比如123xx 一共存在100种可能性,其中12345是可行的,而12346是不可行的

AC代码:

#include "iostream"
#include "iomanip"
#include "string.h"
#include "stack"
#include "queue"
#include "string"
#include "vector"
#include "set"
#include "map"
#include "algorithm"
#include "stdio.h"
#include "math.h"
#pragma comment(linker, "/STACK:102400000,102400000")
#define bug(x) cout<<x<<" "<<"UUUUU"<<endl;
#define mem(a,x) memset(a,x,sizeof(a))
#define step(x) fixed<< setprecision(x)<<
#define mp(x,y) make_pair(x,y)
#define pb(x) push_back(x)
#define ll long long
#define endl ("\n")
#define ft first
#define sd second
#define lrt (rt<<1)
#define rrt (rt<<1|1)
using namespace std;
const ll mod=1e9+7;
const ll INF = 1e18+1LL;
const int inf = 1e9+1e8;
const double PI=acos(-1.0);
const int N=1e5+100;ll dp[18][162][162], bit[20];
ll dfs(int limit, int pos, int sum, int v, int mod){if(sum+pos*9+9<mod || sum>mod) return 0;if(pos==-1) return sum==mod && v==0;if(dp[pos][sum][v]!=-1 && !limit) return dp[pos][sum][v];int up=limit?bit[pos]:9;ll ans=0;for(int i=0; i<=up; ++i){ans+=dfs(limit&&i==bit[pos], pos-1, sum+i, (v*10+i)%mod, mod);}if(!limit) dp[pos][sum][v]=ans;return ans;
}ll solve(ll x){int p=0;while(x){bit[p++]=x%10;x/=10;}ll ret=0;for(int i=1; i<=p*9; ++i){mem(dp,-1);ret+=dfs(1,p-1,0,0,i);}return ret;
}int main(){ll a,b;scanf("%lld%lld",&a, &b);printf("%lld\n",solve(b)-solve(a-1));return 0;
}

转载于:https://www.cnblogs.com/max88888888/p/7610658.html

bzoj1799 数位dp相关推荐

  1. [BZOJ1799][Ahoi2009]self 同类分布(数位dp)

    题目描述 给出两个数 a,ba,b ,求出 [a,b][a,b] 中各位数字之和能整除原数的数的个数. 输入输出格式 输入格式: 一行,两个整数 aa 和 bb 输出格式: 一个整数,表示答案 输入输 ...

  2. 数位dp真·浅谈 By cellur925

    预警:由于是从$Vergil$学长那里和$Mathison$大神那里学来的,所以清一色记忆化搜索!qwq 巨佬的数位dp讲解(未来的咕咕日报头条): https://www.luogu.org/blo ...

  3. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  4. 不要62 ---数位DP

    题意:求m到n中不含62和4的数的个数. 题目链接 思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数. #include<stdio.h> #include<str ...

  5. bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...

  6. cojs 简单的数位DP 题解报告

    首先这道题真的是个数位DP 我们考虑所有的限制: 首先第六个限制和第二个限制是重复的,保留第二个限制即可 第五个限制在转移中可以判断,不用放在状态里 对于第一个限制,我们可以增加一维表示余数即可 对于 ...

  7. 数位DP 不断学习中。。。。

    1, HDU 2089  不要62 :http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:不能出现4,或者相邻的62, dp[i][0],表示不存在不吉 ...

  8. [数位dp] spoj 10738 Ra-One Numbers

    题意:给定x.y.为[x,y]之间有多少个数的偶数位和减去奇数位和等于一. 个位是第一位. 样例: 10=1-0=1 所以10是这种数 思路:数位dp[i][sum][ok] i位和为sum 是否含有 ...

  9. 数位dp(求1-n中数字1出现的个数)

    题意:求1-n的n个数字中1出现的个数. 解法:数位dp,dp[pre][now][equa] 记录着第pre位为now,equa表示前边是否有降数字(即后边可不能够任意取,true为没降,true为 ...

最新文章

  1. win32ctypes.pywin32.pywintypes.error: (2, ‘LoadLibraryEx‘, ‘系统找不到指定的文件。‘)
  2. python统计文章单词次数
  3. php 取多级分类,php – 获取所有类别(多级)
  4. python最小二乘法拟合_Python 普通最小二乘法(OLS)进行多项式拟合
  5. linux reboot命 过程,IDRAC安装dell服务器操作系统(linux or windows),用到生命周期管理器...
  6. JAVA将list2合并到list1_java如何将两个list合并的问题
  7. C++结构体传参问题
  8. 第一章 批判性思维概念
  9. vs code 关闭右下角弹窗方法
  10. MySQL 三星索引
  11. Spring Cloud Contract实践
  12. 【嵌入式底层知识修炼】基于通用消抖算法,拓展通用非阻塞Key按键识别算法
  13. 洛谷B2065 鸡尾酒疗法(while限制组数)
  14. cisco设备接口下配置encapsulation dot1q vlan-id的作用
  15. 再见安卓 鸿蒙,鸿蒙os 再见安卓
  16. 二级JAVA各章考分分布_catti二级笔译考试题型、分数分布及备考指南
  17. 详解IE浏览器在线安装ocx和DLL文件的方法(打包成cab文件)
  18. 如何做好百度竞价?需了解常见的推广方式、工具和开户类型
  19. python课堂笔记课后练习(高琪400集第一季)
  20. 超音速启动 2020 年版发布

热门文章

  1. shaderlab学习一
  2. call_user_func_array 笔记
  3. JAVA日期加减运算
  4. 《敏捷开发绩效管理》扩展阅读(敏捷开发绩效管理,敏捷团队绩效管理)
  5. 《JAVA练习题目7》 定义一个素数生成器类PrimeGenerator,用于生成给定区间内的所有素数。(类PrimeGenerator都由类Main代替)
  6. ggtree实现系统发育树可视化
  7. selenium 验证码识别_如何获取验证码?
  8. mysql安装教程博音网_RTSP视频平台EasyNVR使用mysql数据源启动报错unknow drivermysql优化...
  9. oracle 关系 表 视图_oracle动态视图v$,v_$,gv$,gv_$与x$之间的关系
  10. rabbitmq实战指南_RabbitMQ之脑裂