BZOJ 1799 self 同类分布(数位dp,区间各位数字和能整除原数的数字个数)
2016-08-31 00:16
471 查看
题目链接:
BZOJ 1799 self 同类分布
题意:
给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数。
数据范围:a≤b≤1018
分析:
暴力枚举所有可能的数字和即可。
需要判断余数等于0并且所有数字和等于设定的sum。
BZOJ 1799 self 同类分布
题意:
给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数。
数据范围:a≤b≤1018
分析:
暴力枚举所有可能的数字和即可。
需要判断余数等于0并且所有数字和等于设定的sum。
#include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> using namespace std; typedef long long ll; int digit[20]; ll dp[20][200][200]; ll dfs(int pos, int rem, int pre, int sum, int limit) { if (pos == -1) return rem == 0 && pre == sum; if (!limit && dp[pos][rem][pre] != -1) return dp[pos][rem][pre]; if (pre > sum) return 0; int last = limit ? digit[pos] : 9; ll ret = 0; for (int i = 0; i <= last; ++i) { ret += dfs(pos - 1, (rem * 10 + i) % sum, pre + i, sum, limit && (i == last)); } if (!limit) dp[pos][rem][pre] = ret; return ret; } ll solve(ll x) { int len = 0; memset(digit, 0, sizeof(digit)); while (x) { digit[len++] = x % 10; x /= 10; } ll ret = 0; for (int i = 1; i <= 9 * len; ++i) { memset(dp, -1, sizeof(dp)); ret += dfs(len - 1, 0, 0, i, 1); } return ret; } int main() { ll n, m; while (~scanf("%lld%lld", &n, &m)) { printf("%lld\n", solve(m) - solve(n - 1)); } return 0; }
相关文章推荐
- BZOJ3275 Number (最小割)
- BZOJ2809——[Apio2012]dispatching
- BZOJ2809——[Apio2012]dispatching
- bzoj1086[SCOI2005]王室联邦
- [BZOJ1087][SCOI2005]互不侵犯King(状压)[第二题]
- acdream 1064
- HDU3271 SNIBB(数位dp+二分)
- [bzoj1003] [ZJOI2006]物流运输trans
- [bzoj1500][NOI2005]维修数列
- [bzoj1208] [HNOI2004]宠物收养所
- [bzoj1269][AHOI2006]文本编辑器editort
- [bzoj1503][NOI2004]郁闷的出纳员
- bzoj4305 数学
- bzoj3926 广义后缀自动机
- bzoj2780 广义后缀自动机+parent树+Dfs序+树状数组
- BZOJ1997 2-sat
- bzoj4027 贪心
- [BZOJ2038][2009国家集训队][莫队][分块]小z的袜子
- [BZOJ2594][WC2006][LCT][MST]水管局长数据加强版
- [BZOJ2300][HAOI2011][动态凸包]防线修建