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 大小不是你想开,想开 ...
随机推荐
- 微软职位内部推荐-Sr SDE-MODC-Beijing
微软近期Open的职位: JOB TITLE: Senior Software Design EngineerDEPARTMENT: Microsoft Office Division ChinaIM ...
- spring的三种注解管理器
1.依赖注入的注解解析器 在配置文件中; * xsd xmlns:context="http://www.springframework.org/schema/context" h ...
- 字符串截取 方法 String b=a.substring(0, a.indexOf("乘坐"));
String b=a.substring(0, a.indexOf("乘坐"));
- Unity3D开发之NGUI结合粒子系统的遮挡问题
原地址:http://blog.csdn.net/lihandsome/article/details/22194025 我的是NGUI3.0.3版本,在加入粒子系统的时候发现一直都是在精灵的下面,所 ...
- VS2005(vs2008,vs2010)使用map文件查找程序崩溃原因
VS 2005使用map文件查找程序崩溃原因 一般程序崩溃可以通过debug,找到程序在那一行代码崩溃了,最近编一个多线程的程序,都不知道在那发生错误,多线程并发,又不好单行调试,终于找到一个比较好的 ...
- Angular.js入门的样例
感觉这下子,前端的路也宽多了,从容不迫了. 因为可控制的节点又推前了, 有空了好好学一下. 然后结合EXPRESS或METEOR,是不是有点爽? 参考URL: https://toddmotto.co ...
- linux pts/0的含义
pts是所谓的伪终端或虚拟终端,具体表现就是你打开一个终端,这个终端就叫pts/0,如果你再打开一个终端,这个新的终端就叫pts /1.比如用who命令查询当前登录的用户,可以看到每个用户的TTY设备 ...
- maven3常用命令\创建Project
转自 http://blog.csdn.net/edward0830ly/article/details/8748986 ------------------------------maven3常用命 ...
- CKEditor在线编辑器增加一个自定义插件
CKEditor是一个非常优秀的在线编辑器,它的前身就是FCKEditor,CKEditor据官方说是重写了内核的,但功能和性能比FCKEditor更为强大和优越.记得07年的时候第一次接触FCKEd ...
- [杂题]FZU2190 非提的救赎
中文题,题意不多说. 本来感觉很像dp 其实只要从上到下维护单调性就好了 坑是......这个oj......用cin很容易TLE...... //#include <bits/stdc++.h ...