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. 通过替换frm文件方式修改表结构

    版本:5.6.16 在自己的虚拟环境中,测试创建一个表,表结构如下:mysql> drop table yoon_temp;Query OK, 0 rows affected (0.09 sec ...

  2. cocos2dx中的定时器及其分类

    cocos2dx中的定时器分三大类: 1.帧循环定时器 2.一次性定时器 3.自定义定时器 一.帧循环定时器,顾名思义,每一帧都会执行一次,用于实时性要求比较高的场合,如碰撞检测 void sched ...

  3. Week1 Team Homework #1: Study the projects done by previous student groups

      我们研究了学长的项目:百度3D地图API的调用.下面是我们对该项目的一些看法: 优点: 界面清晰 各类之间调用及其他关系容易理清. 缺点: 前段html代码过于冗杂,很多(div)块间的层次关系不 ...

  4. ffmpeg 编码

    编码可以简单理解为将连续的图片帧转变成视频流的过程.以H264为例给出编码的代码: int InitEncoderCodec(int width, int height) { auto enc = a ...

  5. 【BZOJ】【2208】【JSOI2010】连通数

    题解: 1.Tarjan缩点以后对每个连通分量进行深搜,看能到哪些连通分量,能到达的所有连通分量的size之和记为sum.则第i个连通分量对答案的贡献为size[i]*sum(到其他连通分量)+siz ...

  6. windows下编译Libevent

    下载最新的libevent,目前是 libevent-2.0.21-stable.tar.gz 修改“D:\libevent-2.0.21-stable\event_iocp.c”.“D:\libev ...

  7. C#三种定时器的实现

    http://www.coridc.com/archives/2253.html c#中提供了三种类型的计时器: 1.基于 Windows 的标准计时器(System.Windows.Forms.Ti ...

  8. java基础知识回顾之java Socket学习(二)--TCP协议编程

    TCP传输(传输控制协议):TCP协议是一种面向连接的,可靠的字节流服务.当客户端和服务器端彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能进行数据的传输.它将一台主机发出的字节流无差错的 ...

  9. 2010年山东省第一届ACM大学生程序设计竞赛 Balloons (BFS)

    题意 : 找联通块的个数,Saya定义两个相连是 |xa-xb| + |ya-yb| ≤ 1 ,但是Kudo定义的相连是 |xa-xb|≤1 并且 |ya-yb|≤1.输出按照两种方式数的联通块的各数 ...

  10. REST_FRAMEWORK加深记忆-第二次练习官方文档2

    优化前和优化后的代码,融在一起,能看看进化的过程. MODELS.PY from django.db import models from pygments.lexers import get_all ...