hdu 4389 X mod f(x) 数位dp

原创 2015年07月09日 14:50:20

题链:http://acm.hdu.edu.cn/showproblem.php?pid=4389

X mod f(x)

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2330    Accepted Submission(s): 919


Problem Description
Here is a function f(x):
   int f ( int x ) {
       if ( x == 0 ) return 0;
       return f ( x / 10 ) + x % 10;
   }

   Now, you want to know, in a given interval [A, B] (1 <= A <= B <= 109), how many integer x that mod f(x) equal to 0.
 

Input
   The first line has an integer T (1 <= T <= 50), indicate the number of test cases.
   Each test case has two integers A, B.
 

Output
   For each test case, output only one line containing the case number and an integer indicated the number of x.
 

Sample Input
2 1 10 11 20
 

Sample Output
Case 1: 10 Case 2: 3
 


数位dp学习链接:http://blog.csdn.net/cyendra/article/details/38087573


题意:相当于问区间内有多少数满足 X%(∑xi)==0。∑xi 是数字X的数位和。

做法:因为最多9位数,所以可以枚举∑xi,最大为81。 然后就是数位dp了。

sum是数位和,nwmod是取模结果,mod 是枚举的模

当数位和sum==mod而且,nwmod最后==0,成立计数。



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <stack>
#include <queue>
#include <vector>
#include <deque>
#include <set>
#include <map> 

typedef long long LL;
const int maxn=81;
int dig[maxn];
int f[10][maxn][maxn][maxn];
//nwmod  数取模后 sum 数位和
LL dfs(int pos,int nwmod,int sum,int mod,int limit)
{
	if (pos<0) return sum==mod&&nwmod==0;
	if (!limit&&f[pos][nwmod][sum][mod]!=-1) 
		return f[pos][nwmod][sum][mod];
	LL res=0;
	int last=limit?dig[pos]:9;
	for (int i=0;i<=last;i++)
	{
		res+=dfs(pos-1,(nwmod*10+i)%mod,sum+i,mod,limit&&(i==last));
	}
	if (!limit) f[pos][nwmod][sum][mod]=res;
	return res;
}

LL solve(LL n){
	int len=0; 
	while (n)
	{
		dig[len++]=n%10;
		n/=10;
	}
	LL ans=0;
	for(int i=1;i<=81;i++)//枚举最后的mod
	{
		ans+=dfs(len-1,0,0,i,1);
	}
	return ans;
}
int main()
{
	int n;
	int t;
	int cas=1;
	scanf("%d",&t);
	int a,b;
	memset(f,-1,sizeof f);
	while(t--)
	{
		scanf("%d%d",&a,&b);
		if(a>b)
			swap(a,b); 
		printf("Case %d: %I64d\n",cas++,solve(b)-solve(a-1));
	}
	return 0; 
}

/*
2
1 10
11 20 

Sample Output
Case 1: 10
Case 2: 3 
*/

 


版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU4389(数位DP)

题目:X mod f(x)   题意:问在区间[A,B]之间,有多少个数满足,x%f(x)=0,f(x)代表x的各位数字之和。   解析:本题一是可以通过打表来计算,二是可以通过数位DP来求解。 我们...
  • ACdreamers
  • ACdreamers
  • 2013年07月13日 15:15
  • 15530

hdu 4389 X mod f(x)(超暴力打表)

X mod f(x) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot...
  • acm_cxq
  • acm_cxq
  • 2016年06月12日 11:57
  • 1114

hdu1573 X问题(中国剩余定理)

X问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss...
  • d_x_d
  • d_x_d
  • 2015年09月22日 21:58
  • 1524

hdu 数位DP汇总 + hdu 4507 题解

基础教学 + 初探hdu2089题解:http://blog.csdn.net/techmonster/article/details/50273967 进阶 【重要模板】(数位dp几乎都是这个模板)...
  • Techmonster
  • Techmonster
  • 2015年12月13日 16:55
  • 606

HDU2089 不要62(数位DP入门经典题目)

昨天做了一道很奇怪的数字题,不知道怎么做,今天才知道是数位DP ……我来学习学习。 传送门 大意:给定区间[n,m][n,m],求在n到m中没有“62“或“4“的数的个数。如62315包含62,8...
  • geng4512
  • geng4512
  • 2015年08月24日 20:48
  • 1190

【HDU 2089】不要62(数位dp)

露华染清,飞霜点墨,谁独坐案边点一盏秋茶
  • reverie_mjp
  • reverie_mjp
  • 2016年05月06日 20:41
  • 490

[bzoj3679]数字之积

题目大意一个数x各个数位上的数之积记为f(x) 求[L,R)中满足0 < f(x)
  • WorldWide_D
  • WorldWide_D
  • 2016年12月08日 15:41
  • 392

【数位DP】BZOJ3780数字统计

Time Limit: 10 Sec Memory Limit: 128 MB Description 小A正在研究一些数字统计问题。有一天他突然看到了一个这样的问题: 将[L..R][L.....
  • cqbztsy
  • cqbztsy
  • 2016年02月26日 12:20
  • 682

hdu 4734 F(x) (数位DP中dp数组的重用)

F(x) Time Limit : 1000/500ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissio...
  • qq_37025443
  • qq_37025443
  • 2017年11月18日 14:26
  • 30

hdu 1573 X问题 中国剩余定理(直接模板就OK了)

#include #include #include using namespace std; void gcd(int a,int b,int &d,int &x,int &y) {//a*x...
  • a601025382s
  • a601025382s
  • 2013年08月25日 10:21
  • 3030
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 4389 X mod f(x) 数位dp
举报原因:
原因补充:

(最多只允许输入30个字)