数位DP CF 55D Beautiful numbers
2016-05-10 10:49
190 查看
题目链接
题意:定义"beautiful number"为一个数n能整除所有数位上非0的数字
分析:即n是数位所有数字的最小公倍数的倍数。LCM(1到9)=2520。n满足是2520的约数的倍数。dp[len][val][lcm]一维为数的位数,一维为%2520的值(保存原数不可能,也没必要,2520是可行的最小公倍数最大的一个),一维为当前数位的lcm,判断满足的条件是val%lcm==0。这题离散化2520的约数,否则空间开不下。
题意:定义"beautiful number"为一个数n能整除所有数位上非0的数字
分析:即n是数位所有数字的最小公倍数的倍数。LCM(1到9)=2520。n满足是2520的约数的倍数。dp[len][val][lcm]一维为数的位数,一维为%2520的值(保存原数不可能,也没必要,2520是可行的最小公倍数最大的一个),一维为当前数位的lcm,判断满足的条件是val%lcm==0。这题离散化2520的约数,否则空间开不下。
#include <bits/stdc++.h> typedef long long ll; ll dp[20][2520][50]; int digit[20]; int id[2521]; int tot; int GCD(int a, int b) { return b ? GCD (b, a % b) : a; } int LCM(int a, int b) { return a / GCD (a, b) * b; } void init_LCM() { tot = 0; for (int i=1; i<=2520; ++i) { if (2520 % i == 0) { id[i] = ++tot; } } } ll DFS(int pos, int val, int lcm, bool limit) { if (pos == -1) { return val % lcm == 0; } ll &now = dp[pos][val][id[lcm]]; if (!limit && now != -1) { return now; } int d = limit ? digit[pos] : 9; ll ret = 0; for (int i=0; i<=d; ++i) { int tval = (val * 10 + i) % 2520; int tlcm = i ? lcm / GCD (lcm, i) * i : lcm; ret += DFS (pos - 1, tval, tlcm, limit && i == d); } if (!limit) { now = ret; } return ret; } ll solve(ll x) { int len = 0; if (x == 0) { digit[len++] = 0; } else { while (x) { digit[len++] = x % 10; x /= 10; } } return DFS (len - 1, 0, 1, true); } int main() { init_LCM (); memset (dp, -1, sizeof (dp)); int T; scanf ("%d", &T); while (T--) { ll l, r; std::cin >> l >> r; std::cout << solve (r) - solve (l - 1) << '\n'; } return 0; }
相关文章推荐
- Redis CrackIT入侵事件分析
- genymotion创建虚拟设备提示failed to deploy virtual device - 爱程序网
- 欢迎使用CSDN-markdown编辑器
- Yii2.0 实现RESTful风格的简单API
- MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 的原因分解决办法
- 在二元树中找出和为某一值的所有路
- C#对于字符串的处理类(剪裁、过滤危险字符、替换sql中有问题符号等)
- 安卓017ListView & GridView & ScrollView
- ubuntu 下svn命令下,外部diff 工具设置
- 【Leetcode】之Length of Last Word
- UVA_820_Internet Bandwidth
- 输入一组数,创建(带头节点)的单链表(头插法、尾插法)
- Android知识点收集
- Unsupported major.minor version 52.0
- java enum 举例
- Java 异常
- git
- git安装步骤
- (转)VS自带工具:dumpbin的使用
- 3.直接插入排序,希尔排序,归并排序