HOJ-1983-Beautiful numbers
来源:互联网 发布:java集合泛型转换工具 编辑:程序博客网 时间:2024/06/01 09:11
ACM模版
描述
题解
这是西安邀请赛的一道模拟赛题,也是 CF 上的原题。很明显是数位 dp,也是树归。
这个题不是我自己做出来的,是看了别人的题解搞懂的,虽然看出来了是 dp,一开始却没有想出来怎么搞。
既然要求
各个数位的乘积可以优化为
这时,当前数 j 也就变得非常非常小了,最大为 2520,这是因为 j % k == 0 等价于 j % 2520 % k == 0。
所以最后我们只需要 dp[i][j][k],i 最大为20,j 最大为2520,k 最大为2520的约数个数,约莫着开 dp[20][2525][55] 也就够了。
代码
#include <iostream>using namespace std;typedef long long ll;const int MAXI = 20;const int MAXJ = 2525;const int MAXK = 55;const int MAXN = 2520;ll dp[MAXI][MAXJ][MAXK];int digit[MAXI];int hash_[MAXJ];int gcd(int a, int b){ if (!b) { return a; } return gcd(b, a % b);}int lcm(int a, int b){ return a / gcd(a, b) * b;}ll dfs(int pos, int num, int mod, bool flag){ if (pos == 0) { return num % mod == 0; } if (flag && dp[pos][num][hash_[mod]] != -1) { return dp[pos][num][hash_[mod]]; } int tag = flag ? 9 : digit[pos]; ll ans = 0; for (int i = 0; i <= tag; i++) { ans += dfs(pos - 1, (num * 10 + i) % MAXN, i ? lcm(mod, i) : mod, flag || i < tag); } if (flag) { dp[pos][num][hash_[mod]] = ans; } return ans;}ll calc(ll x){ if (x < 0) { return 0; } int len = 0; while (x) { digit[++len] = x % 10; x /= 10; } return dfs(len, 0, 1, 0);}// 计算 MAXN 所有的约数void init(){ memset(dp, -1, sizeof(dp)); int cnt = 0; for (int i = 1; i * i <= MAXN; i++) { if (MAXN % i == 0) { hash_[i] = cnt++; if (i * i != MAXN) { hash_[MAXN / i] = cnt++; } } }}int main(){ init(); ll x, y; while (~scanf("%lld%lld", &x, &y)) { printf("%lld\n", calc(y) - calc(x - 1)); } return 0;}
阅读全文
0 0
- HOJ-1983-Beautiful numbers
- HOJ 1983 Beautiful numbers (数位dp)
- Beautiful Numbers
- Beautiful numbers
- Beautiful Numbers
- Beautiful numbers
- Beautiful numbers
- hoj 11170 Weird Numbers
- Hoj 1181 Ugly Numbers
- hoj 1087 Self Numbers
- hoj 1533 Fibonacci Numbers
- HOJ 1014 Niven Numbers
- HOJ 1444 Humble Numbers
- Why are numbers beautiful?
- Codeforces_C - Beautiful Numbers
- codeforces Beautiful Numbers
- UVa 11472 - Beautiful Numbers
- codeforces55D Beautiful numbers
- 反射
- 初识反射
- 读论文
- 21.Spring_基于配置文件的方式实现切面通知
- PHP中引用的使用和注意事项
- HOJ-1983-Beautiful numbers
- 一个简单的flask程序
- linux 下普通用户python-pandas模块不能使用的问题
- 正则表达式解英语单词字谜
- 访问GitHub慢
- redis 添加密码
- 高并发思路
- [Scrapy爬虫]自己修改常用网站,去广告,省时间
- Jquery第5章节:基础DOM和CSS操作