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 <= 10
9), 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
 

题意:计算区间内一个数字各位之和能整除该数字的个数

思路:

分别计算出[1, b]中符合条件的个数和[1, a-1]中符合条件的个数。

d[l][i][j][k]表示前l位和为i模j的结果为k的数的个数,那么就有方程

d[l+1][i+x][j][(k*10+x)%j] += d[l][i][j][k]

预处理出d[l][i][j][k],然后再逐位统计即可

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; int bit[10];
int dp[10][82][82][82];
//d[l][i][j][k]表示前l位和为i模j的结果为k的数的个数
void set()
{
int i,j,k,l,x;
for(i = 1; i<=81; i++)
dp[0][0][i][0] = 1;
for(l = 0; l<9; l++)
for(i = 0; i<=l*9; i++)
for(j = 1; j<=81; j++)
for(k = 0; k<j; k++)
for(x = 0; x<=9; x++)
dp[l+1][i+x][j][(k*10+x)%j] += dp[l][i][j][k];
} int solve(int n)
{
if(!n)
return 0;
int ans,i,j,k,len;
int sum,tem1,tem2,s,bit[10],r;
len = sum = ans = 0;
tem1 = tem2 = n;
s = 1;
while(tem1)
{
bit[++len] = tem1%10;
tem1/=10;
sum+=bit[len];//每位数之和
}
if(n%sum==0)//本身要先看是否整除
ans++;
for(i = 1; i<=len; i++)
{
sum-=bit[i];//将该位清0
tem2/=10;
s*=10;
tem1 = tem2*s;
for(j = 0; j<bit[i]; j++) //枚举该位的状况
{
for(k = sum+j; k<=sum+j+9*(i-1); k++) //该位与更高位的和,而比该位低的和择优9*(i-1)种
{
if(!k)//和为0的状况不符合
continue;
r = tem1%k;//现在该数对各位和进行取余
if(r)
r = k-r;//余数大于0,那么k-dd得到的数肯定能被t整除
ans+=dp[i-1][k-sum-j][k][r];//加上个数
}
tem1+=s/10;//标记现在算到哪里,例如1234,一开始t是1230,然后1231,1232,1233,1234,接下来1200,就是1210,1220,1230
}
}
return ans;
} int main()
{
int T,l,r,cas = 1;
set();
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&l,&r);
printf("Case %d: %d\n",cas++,solve(r)-solve(l-1));
} return 0;
}

HDU4389:X mod f(x)(数位DP)的更多相关文章

  1. hdu 4389 X mod f(x) 数位DP

    思路: 每次枚举数字和也就是取模的f(x),这样方便计算. 其他就是基本的数位Dp了. 代码如下: #include<iostream> #include<stdio.h> # ...

  2. hdu4734 F(x)(数位dp)

    题目传送门 F(x) Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  3. HDU 4734 F(x) ★(数位DP)

    题意 一个整数 (AnAn-1An-2 ... A2A1), 定义 F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1,求[0..B]内有多少 ...

  4. 【hdu4734】F(x) 数位dp

    题目描述 对于一个非负整数 $x=​​\overline{a_na_{n-1}...a_2a_1}$ ,设 $F(x)=a_n·2^{n-1}+a_{n-1}·2^{n-2}+...+a_2·2^1+ ...

  5. [hdu4734]F(x)数位dp

    题意:求0~f(b)中,有几个小于等于 f(a)的. 解题关键:数位dp #include<bits/stdc++.h> using namespace std; typedef long ...

  6. F(x) 数位dp

    Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight ...

  7. HDU-4734 F(x) 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 注意到F(x)的值比较小,所以可以先预处理所有F(x)的组合个数.f[i][j]表示 i 位数时 ...

  8. HDU 4734 - F(x) - [数位DP][memset优化]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 Time Limit: 1000/500 MS (Java/Others) Memory Lim ...

  9. hdu4389 X mod f(x)

    链接 这个题因为总和加起来是比较小的9*9 = 81  这样可以保留前面枚举的数对所有的可能出现的和的余数,然后依次向下找. #include <iostream> #include< ...

随机推荐

  1. Seafile V4.1 安装笔记

    yum -y install gcc gcc-c++ make cmake pcre pcre-devel expat expat-devel curl wget mlocate gd gd-deve ...

  2. 6、WPF中的特殊字符与空白

    特殊字符: 小于号 <  字符实体采用&lt表示 大于号 >  字符实体采用&gt表示 &符号      字符实体采用&amp表示 引号"&quo ...

  3. eclipse下mysql编程

    mysql -uroot -p 密码 1:如果/usr/include/mysql路径下不存在头文件请: apt-get install libmysql++安装开发包 2:程序中添加头文件<m ...

  4. iOS/Objective-C开发 字典NSDictionary的深复制(使用category)

    目标:把NSDictionary对象转换成NSMutableDictionary对象,对象内容是字符串数组,需要实现完全复制(深复制). 如果调用NSDictionary的mutableCopy方法, ...

  5. 在唯一密钥属性“value”设置为“Default.aspx”时,无法添加类型为“add”的重复集合项

    环境:windows server 2012  asp.net 找到网站目录:wwwroot ,打开web.config文件,在 在<files>与</files>之间加入代码 ...

  6. c++ break while

    #include <iostream> #include <vector> #include <pthread.h> #include "destory_ ...

  7. Eclipse 安装热部署JRebel

    开发环境 sts-3.7.2.RELEASE 安装步骤 1.打开应市场 2.搜索JRebel并进行下载 3.下载完成后点击JReble Configuation进入

  8. SVN提交错误:working copy is not up-to-date解决方法

    我在项目中删了2个jar,然后SVN提交,一直提交不成功 svn在提交时报错如下图: working copy is not up-to-date svn:commit failed(details ...

  9. 16进制串hex与ASCII字符串相互转换

    提供两个函数,方便十六进制串与ASCII 字符串之间的相互转换,使用函数需要注意的是返回的串是在堆上通过 calloc 分配的,所以,记得使用完返回值释放该块,并且将指向该块的指针 =NULL . c ...

  10. 数据库范式(1NF 2NF 3NF BCNF)

    http://blog.csdn.net/xuxurui007/article/details/7738330 http://www.cnblogs.com/laodao1/archive/2009/ ...