ACwing 311. 月之谜 数位dp
题意:问你[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相关推荐
- AcWing 338. 计数问题(数位DP)
题目链接 https://www.acwing.com/problem/content/340/ 思路 我们想要快速求得[1,n][1,n][1,n]内所有数的某些数字出现的次数,那么我们要从十进制数 ...
- Acwing 1081. 度的数量(以及本人对数位dp的浅薄理解)
题意: 求给定区间 [X,Y] 中满足下列条件的整数个数:这个数恰好等于 K 个互不相等的 B 的整数次幂之和. 题解: 数位DP 技巧1:[X,Y]=>f(Y)-f(X-1) 技巧2:用树的方 ...
- 1083 Windy数(数位dp)
1. 问题描述: Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数.Windy 想知道,在 A 和 B 之间,包括 A 和 B,总共有多少 ...
- windy数(数位dp)
1. 问题描述: windy 定义了一种 windy 数.不含前导零且相邻两个数字之差至少为 2 的正整数被称为 windy 数. windy 想知道,在 A 和 B 之间,包括 A 和 B,总共有多 ...
- 简单数位dp及对前导0的理解
数位dp的实质: 一种快速枚举的方式,它满足dp的性质,然后进行记忆化搜. 例题 : 牛客-数位小孩 题目描述: 九峰最近沉迷数位dp,这天他又造了个数位dp题: 给出一个区间[l,r][l,r][l ...
- 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)
1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 2774 Solved: 1230 [Submit ...
- 不要62 ---数位DP
题意:求m到n中不含62和4的数的个数. 题目链接 思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数. #include<stdio.h> #include<str ...
- bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...
- cojs 简单的数位DP 题解报告
首先这道题真的是个数位DP 我们考虑所有的限制: 首先第六个限制和第二个限制是重复的,保留第二个限制即可 第五个限制在转移中可以判断,不用放在状态里 对于第一个限制,我们可以增加一维表示余数即可 对于 ...
最新文章
- xcode 编译静态库所要注意
- 网络优化常见专业术语详解
- 基站基带fgpa 服务器芯片,基于FPGA的AIS基带数据处理芯片设计
- 解决 同时安装 python3,python2环境时,用pip安装 python3 包
- @ImportResource()注解的使用
- 【面向对象】面向对象程序设计测试题1-Java语言的发展与特性测试题
- Kafka笔记-Spring Boot消费者构造
- Python深度学习(Deep Learning with Python) 中文版+英文版+源代码
- 多物理场面向对象模拟环境MOOSE学习手册
- dual mysql 获取序列_如何获取 MySQL 插入数据的自增 ID
- 如何下载和安装 iOS开发教程
- 动态数组索引越界问题
- 数据通信与计算机网复习题,数据通信与计算机网络 复习题总.doc
- 全面剖析泛微协同管理平台(e-cology)十大亮点
- 《软件项目管理》课程知识总结
- ESP8266 WIFI 模块和手机通信
- oracle导出pck文件,Oracle sqlloader自动化导入迁移工具—可批量生成千万控制文件与批处理文件|一键执行(推荐)...
- linux把大文件分成小文件,linux文件分割(将大的日志文件分割成小的)
- charles抓包https证书下载
- 用c语言编写程序,求∑(k=1~100)k+∑(k=1~50)k2,c语言程序,求(100∑k=1 k)+(50∑k=1 k^2)+(10∑k=1 1/k) 这...