题意:问你[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. 吴渴楨 160809206
  2. libqrencode生成二维码图片的问题
  3. 随机手机号码_骗妹子手机号码,还记得iPhone自带计算器的小魔术吗?,看教程...
  4. 代码生成器的存在价值 选择自 mechiland 的 Blog
  5. 6月,回忆我失去的爱情
  6. Flowable 数据库表结构 ACT_RU_EXECUTION
  7. python split 引号_Python 学习笔记 - 字符串
  8. linux diff详解
  9. 湖北警方打掉一制贩假酒团伙 涉案金额1.6亿元
  10. server2012R2VC++2015 redistributable安装出错KB2999226-x64.msu 此更新不适合你的计算机
  11. iPad2 3G版 5.1.1降级到4.3.3(需要4.3.3SHSH备份)
  12. 智慧校园大数据平台建设和运营整体解决方案
  13. 吴伯凡-认知方法论-既然认知意味着痛苦,为什么选择认知?
  14. linux btrfs 格式化,Btrfs 文件系统修复技巧
  15. 【计几】平面最短欧氏距离点对题集
  16. RK3066移动鼠标,有时会卡顿一会儿
  17. RHCE 考试经验总结
  18. 如何克隆服务器系统盘,如果把云服务器系统盘克隆
  19. 数字证书明文_Android 明文数字证书风险解决方案
  20. celery爬取58同城二手车数据及若干问题

热门文章

  1. python数独伪代码回溯法_数独 #回溯算法 #CTF
  2. 【毕业设计之python系列】基于Flask的在线音乐网设计与实现
  3. Could not set property ‘‘ of ‘class com.xxx.domain.vo.SelectTopicDetailsVO‘ with value ‘xxx‘
  4. MATLAB制作PPT(0):基本概念
  5. 【AI创新者】TensorFlow 贡献者唐源:掌握 Google 深度学习框架的正确姿势
  6. https客户端与服务端认证过程详解
  7. 实现Macbook Air/安卓手机/苹果手机日历同步
  8. 北京的“七环路”解决不了堵车问题 预计2015年通车 全长约940公里
  9. 怪兽来袭DARTZ款奔驰G 63逆天越野
  10. python2.7 安装pypcap出错 pcap.h not found