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 大小不是你想开,想开 ...
随机推荐
- 【BZOJ 1798】 [Ahoi2009]Seq 维护序列seq
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- 【BZOJ2330】 [SCOI2011]糖果
Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...
- javascript面向对象思想2
上篇说到面向对象可以帮我们梳理页面的逻辑的文章(http://www.cnblogs.com/hetaojs/p/6024013.html),很多朋友看了说我这种写法是初级的面向对象小儿科,确实是初级 ...
- 在Hadoop分布式文件系统的索引和搜索
FROM:http://www.drdobbs.com/parallel/indexing-and-searching-on-a-hadoop-distr/226300241?pgno=3 在今天的信 ...
- JS、C# 去除html标签
JS去除html标签 var str = "<span style="display:none;" mce_style="display:none;&qu ...
- (转)火溶CEO王伟峰:Unity3D手机网游开发
今天看到这篇文章,感觉很不错,尤其是那句“Unity3D的坑我觉得最严重的坑就是没有懂3D的程序员,把Unity当成Office用”. 转自http://blog.csdn.net/wwwang891 ...
- c_str 以及atoi
const char *c_str();c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类 ...
- Python的作用域
Python的作用域 转自:http://www.cnblogs.com/frydsh/archive/2012/08/12/2602100.html Python是静态作用域语言,尽管它自身是一个动 ...
- 2026-Keroro侵略地球
描述 Keroro来侵略地球之前,曾跟Giroro伍长打赌:“我一个人灭掉整个地球给你看!”. 于是Keroro同学真的自己一个人来到地球开始他的侵略行动了.从K隆星出发之前,Keroro从Kurur ...
- 【HTTP】Fiddler(一) - Fiddler简介和使用
1.为什么是Fiddler? 抓包工具有很多,小到最常用的web调试工具firebug,达到通用的强大的抓包工具wireshark.为什么使用fiddler?原因如下: a.Firebug虽然可以抓包 ...