HDU 4389 X mod f(x)
题意:求[A,B]内有多少个数,满足x % f(x) == 0。
解法:数位DP。转化为ans = solve(b) - solve(a - 1)。设dp[i][sum][mod][r]表示长度为i,各位和为sum,模mod余r的数的个数。
当在数字后面新添加一位j时,则有dp[i + 1][sum + j][mod][(r * 10 + j) % mod] += dp[i][sum][mod][r]。
当一个数比n小时,一定是因为从某一位开始出现了当前位的数字比n当前位数字小的情况,从高到低枚举这种情况出现的位数,枚举这位的数字,枚举所有数字的和,即模,满足等式(num + j * 10 ^ i + r) % mod == 0时即符合情况,num为前i位确定时的数值。
for i len...1
for j 0...digit[i]
for mod 1...81
for r 0...mod - 1
if (当前已确定位数值 + j * 10 ^ i + r) % mod == 0
ans += dp[i - 1][mod - 前i位和 - j][mod][r]
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
int dp[12][85][85][85] = {0};
int f(int x)
{
if(x == 0) return 0;
return f(x / 10) + x % 10;
}
void init()//初始化
{
for(int i = 0; i < 85; i++)
dp[0][0][i][0] = 1;
for(int i = 0; i < 9; i++)
for(int j = 0; j < 85; j++)
for(int k = 0; k < 85; k++)
for(int l = 0; l < k; l++)
for(int m = 0; m < 10 && m + j < 85; m++)
dp[i + 1][j + m][k][(l * 10 + m) % k] += dp[i][j][k][l];
}
int solve(int x)
{
int ans = 0;
if(x && (x % f(x) == 0))
ans++;
int digit[15] = {0};
int ten[15] = {0, 1, 0};
for(int i = 2; i <= 10; i++)
ten[i] = ten[i - 1] * 10;
int len = 1;
int tmp = x;
while(tmp)
{
digit[len++] = tmp % 10;
tmp /= 10;
}
int sum = 0;
int num = 0;
for(int i = len - 1; i >= 1; i--)//枚举位数
{
for(int j = 0; j < digit[i]; j++)
for(int k = 1; k < 85; k++)
for(int l = 0; l < k; l++)
if((k >= (sum + j)) && ((num + j * ten[i] + l) % k == 0))
ans += dp[i - 1][k - sum - j][k][l];
sum += digit[i];
num += digit[i] * ten[i];
}
return ans;
}
int main()
{
init();
int T;
while(~scanf("%d", &T))
{
int cnt = 1;
while(T--)
{
int a, b;
scanf("%d%d", &a, &b);
printf("Case %d: %d\n", cnt++, solve(b) - solve(a - 1));
}
}
}
HDU 4389 X mod f(x)的更多相关文章
- HDU - 4389 X mod f(x)(数位dp)
http://acm.hdu.edu.cn/showproblem.php?pid=4389 题意 为[A,B] 区间内的数能刚好被其位数和整除的数有多少个. 分析 典型的数位dp...比赛时想不出状 ...
- HDU 4389——X mod f(x)(数位DP)
X mod f(x) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- hdu 4389 X mod f(x) 数位DP
思路: 每次枚举数字和也就是取模的f(x),这样方便计算. 其他就是基本的数位Dp了. 代码如下: #include<iostream> #include<stdio.h> # ...
- HDOJ 4389 X mod f(x)
数位DP........ X mod f(x) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- HDU X mod f(x)(题解注释)
X mod f(x) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU4389:X mod f(x)(数位DP)
Problem Description Here is a function f(x): int f ( int x ) { if ( x == 0 ) return 0; return f ( x ...
- HDU 多校对抗 F Naive Operations
Naive Operations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/Other ...
- hdu.1104.Remainder(mod && ‘%’ 的区别 && 数论(k*m))
Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- hdu 4389 数位dp
求区间内满足x%fx==0的数的个数,fx为该数各个位数上的数字之和Sample Input21 1011 20 Sample OutputCase 1: 10Case 2: 3 大小不是你想开,想开 ...
随机推荐
- 解决mybatis查询返回结果值串查
方式一: 通过as 指定 大写重名列的 别名 方式二: 命名数据库中表名时 每个表的主键 id 要起不同的名称, 避免主键重复(但是子表的外键可以和主表的id主键重名, 你想啊, 从表的外键性质不就是 ...
- 集成“支付宝” -b
大致步骤 1.与支付宝签约获取相关参数 合作者身份 ID 与安全校验码 key2.下载需要导入的文件,做相应设置3.在自己的项目中集成支付的方法代码 详细步骤 1.获取合作者身份 ID 与安全校验码 ...
- js 判断对象相等
文笔不是很好,一直在博客园属于那种只看不说的那种,有次心血来潮,想把自己的一些心得记录下来,我认认真真写了大半个小时,谁知一点保存,会话超时然后我的东西不知道去哪里,当时想死的心都有,写博客也就没那个 ...
- Contest2037 - CSU Monthly 2013 Oct (problem F :ZZY and his little friends)
http://acm.csu.edu.cn/OnlineJudge/problem.php?cid=2037&pid=5 [题解]: 没想通这题暴力可以过.... [code]: #inclu ...
- fork与vfork的区别
fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别: 1. fork ():子进程拷贝父进程的数据段,代码段 vfork ( ):子进程与父进程共享数据段 ...
- 在linux下,查看一个运行中的程序, 占用了多少内存
1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有 (1). ps aux: 其中 VSZ(或VSS)列 表示,程序占用了多少虚拟内存. RSS列 表示, 程序占用了多少物 ...
- BZOJ 4311 向量
shallot+向量集 混合版? 首先我们考虑每个向量的存在时间为[L,R] 那么我们知道任意一个区间在线段树上最多被分解成logn个区间 那么我们可以像shallot一样进行区间覆盖 注意到本题的查 ...
- 李洪强iOS开发本人集成环信的经验总结_08_自动登录补充
李洪强iOS开发本人集成环信的经验总结_08_自动登录补充 来到Appdelegate里面 01 - 遵守自动登录的代理协议 02 - 设置自动登录的代理 03 - 判断与实现 04 - 代理方法的 ...
- 李洪强漫谈iOS开发[C语言-014]-变量
01 变量的概念 02 - 变量的语法 03 变量的使用
- [itint5]判断是否为二叉搜索树
http://www.itint5.com/oj/#25 这题在leetcode上是用中序遍历来做的,但是这里由于有相等的情况,即左子树小于等于根,这样中序遍历无法完全判定.可以用递归来做,用递归给出 ...