题意:问你[l,r]内有多少数,是可以被其数位和整除的。

思路:

思路:直观想法,用dp[pos][sum1][sum2]dp[pos][sum1][sum2]dp[pos][sum1][sum2],表示枚举到第pos位,组成sum1的数,累加和为sum2时的方案数。由于sum1很大,所以要考虑每步取模。

想到,若给定一个m,问你有多少数是被m整除,这个就是一个裸的数位dp板子,用一个dp[pos][sum]dp[pos][sum]dp[pos][sum]就可以表示枚举到第pos位,逐步取模结果为sum时的方案数。计数就是最后sum==0时为一个可行方案。

那么回到这个题,由于这个可能的m很小,不超过100,所以我们完全可以枚举m,让本题转化为上述问题。所以我们用dp[pos][sum][add]dp[pos][sum][add]dp[pos][sum][add],表示当前枚举到pos位,逐步取模结果为sum,且数位和为add时的方案数。最后计数可行方案的情况为sum为0且add等于当前枚举的m。

AC代码:

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include <queue>
#include<sstream>
#include <stack>
#include <set>
#include <bitset>
#include<vector>
#define FAST ios::sync_with_stdio(false)
#define abs(a) ((a)>=0?(a):-(a))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<=n;++i)
#define per(i,n,a) for(int i=n;i>=a;--i)
#define endl '\n'
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> PII;
const int maxn = 1e5+200;
const int inf=0x3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1.0);
const int mod = 1e9+7;
inline int lowbit(int x){return x&(-x);}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){d=a,x=1,y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
inline ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
inline ll inv(ll x,ll p){return qpow(x,p-2,p);}
inline ll Jos(ll n,ll k,ll s=1){ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
inline ll read(){ ll f = 1; ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch = getchar();}while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0',  ch = getchar();return x*f; }
int dir[4][2] = { {1,0}, {-1,0},{0,1},{0,-1} };ll a[maxn];
ll p[maxn];
ll P = 10;
ll dp[15][105][105];
ll cur;ll dfs(int pos, ll sum , bool lead, bool limit, ll m, ll add)
{if(pos==-1){return (sum%m==0&&!lead&&add==m);}if(!limit&&dp[pos][sum][add]!=-1&&!lead) return dp[pos][sum][add];ll up = limit?a[pos]:9;ll ans = 0;for(ll i=0;i<=up;i++){if(i==0&&lead)  ans += dfs(pos-1,(sum)%m, true,limit&&a[pos]==i,m,add);else ans += dfs(pos-1,(sum+i*p[pos])%m , false, limit&&a[pos]==i,m,add+i);}if(!limit&&!lead) dp[pos][sum][add]= ans;return ans;
}
ll solve(ll x)
{mem(dp,-1);cur =x;int pos = 0;if(x==0) a[0] = 0, pos=1;elsewhile(x){a[pos++] = x % 10;x /=10;}ll ans = 0;rep(m,1,100){mem(dp,-1);ans += dfs(pos-1,0,true,true, m,0);}return ans;
}int main()
{p[0] = 1;rep(i,1,15) p[i] = p[i-1]*P;ll l = read(), r = read();cout<<solve(r) - solve(l-1)<<endl;return 0;
}

ACwing 311. 月之谜 数位dp相关推荐

  1. AcWing 338. 计数问题(数位DP)

    题目链接 https://www.acwing.com/problem/content/340/ 思路 我们想要快速求得[1,n][1,n][1,n]内所有数的某些数字出现的次数,那么我们要从十进制数 ...

  2. Acwing 1081. 度的数量(以及本人对数位dp的浅薄理解)

    题意: 求给定区间 [X,Y] 中满足下列条件的整数个数:这个数恰好等于 K 个互不相等的 B 的整数次幂之和. 题解: 数位DP 技巧1:[X,Y]=>f(Y)-f(X-1) 技巧2:用树的方 ...

  3. 1083 Windy数(数位dp)

    1. 问题描述: Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数.Windy 想知道,在 A 和 B 之间,包括 A 和 B,总共有多少 ...

  4. windy数(数位dp)

    1. 问题描述: windy 定义了一种 windy 数.不含前导零且相邻两个数字之差至少为 2 的正整数被称为 windy 数. windy 想知道,在 A 和 B 之间,包括 A 和 B,总共有多 ...

  5. 简单数位dp及对前导0的理解

    数位dp的实质: 一种快速枚举的方式,它满足dp的性质,然后进行记忆化搜. 例题 : 牛客-数位小孩 题目描述: 九峰最近沉迷数位dp,这天他又造了个数位dp题: 给出一个区间[l,r][l,r][l ...

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

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

  7. 不要62 ---数位DP

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

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

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

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

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

最新文章

  1. xcode 编译静态库所要注意
  2. 网络优化常见专业术语详解
  3. 基站基带fgpa 服务器芯片,基于FPGA的AIS基带数据处理芯片设计
  4. 解决 同时安装 python3,python2环境时,用pip安装 python3 包
  5. @ImportResource()注解的使用
  6. 【面向对象】面向对象程序设计测试题1-Java语言的发展与特性测试题
  7. Kafka笔记-Spring Boot消费者构造
  8. Python深度学习(Deep Learning with Python) 中文版+英文版+源代码
  9. 多物理场面向对象模拟环境MOOSE学习手册
  10. dual mysql 获取序列_如何获取 MySQL 插入数据的自增 ID
  11. 如何下载和安装 iOS开发教程
  12. 动态数组索引越界问题
  13. 数据通信与计算机网复习题,数据通信与计算机网络 复习题总.doc
  14. 全面剖析泛微协同管理平台(e-cology)十大亮点
  15. 《软件项目管理》课程知识总结
  16. ESP8266 WIFI 模块和手机通信
  17. oracle导出pck文件,Oracle sqlloader自动化导入迁移工具—可批量生成千万控制文件与批处理文件|一键执行(推荐)...
  18. linux把大文件分成小文件,linux文件分割(将大的日志文件分割成小的)
  19. charles抓包https证书下载
  20. 用c语言编写程序,求∑(k=1~100)k+∑(k=1~50)k2,c语言程序,求(100∑k=1 k)+(50∑k=1 k^2)+(10∑k=1 1/k) 这...

热门文章

  1. KVM网络模型之:SR-IOV
  2. 手机端获取摄像头,点击多次拍照,点击拍照的图片可放大
  3. swi plog 使用 learn prolog now的学习
  4. PB5.0 QFE 下载地址
  5. airdrop 是 蓝牙吗_什么是AirDrop?
  6. iview table组件里的 固定列 表格不自适应问题
  7. 帮我写一个风光互补发电系统功率优化分配程序
  8. Facebook Home效应,KakaoTalk也要推启动器
  9. 【JY】中南建筑设计院:雷神山医院设计仿真应用与设计创新那些事
  10. anaconda安装tensorflow