X mod f(x)

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

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
 
Author
WHU
 
Source
 
/*题意:计算区间内一个数字各位之和能整除该数字的个数
思路:分别计算出[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>
#include <iostream>
using namespace std; int bit[];
int dp[][][][];
//d[l][i][j][k]表示前l位和为i模j的结果为k的数的个数
void set()//打表预处理出来你需要的数据
{
int i,j,k,l,x;
for(i = ; i<=; i++)
dp[][][i][] = ;
for(l = ; l<; l++)//枚举的是前l位
for(i = ; i<=l*; i++)//枚举的是当前和,最大和是l*9
for(j = ; j<=; j++)//不可能比81还大,总共才九位数,总和最大就是81,j>81的话得到的就是自己了
for(k = ; k<j; k++)
for(x = ; x<=; x++)//枚举的是当前位上的数
dp[l+][i+x][j][(k*+x)%j] += dp[l][i][j][k];
} //这个(k*10+x)%j是什么意思 //这个状态是前一个状态,位数比等号左边的少一位
//为什么要用k*10+x来模j呐
//因为吧,原来求的是前l位的和,
//现在求得是l+1位的和了,以前的位数
//都向左移动了一位
int solve(int n)
{
if(!n)
return ;
int ans,i,j,k,len;
int sum,tem1,tem2,s,bit[],r;
len = sum = ans = ;
tem1 = tem2 = n;
s = ;
while(tem1)//求每位数之和
{
bit[++len]=tem1%;
tem1/=;
sum+=bit[len];//每位数之和
}
if(n%sum==)//本身要先看是否整除
ans++;
for(i=;i<=len;i++)//前i位
{
sum-=bit[i];//将该位清0
tem2/=;//现在个数是没有个位的
s*=;
tem1=tem2*s;//现在这个数个位上的数是零
for(j=;j<bit[i];j++)//枚举该位的状况(就是遍历这个位上的数)
{
for(k=sum+j;k<=sum+j+*(i-);k++) //该位与更高位的和,而比该位低的和择优9*(i-1)种
{//9*(i-1)因为你枚举每多一位枚举的数字就会多出来9个
if(!k)//和为0的状况不符合
continue;
r=tem1%k;//这里是要保证你枚举到的前i位再加上没枚举到那些位加起来不会超过原来的数
if(r)
r=k-r;//余数大于0,那么k-r得到的数肯定能被k整除
ans+=dp[i-][k-sum-j][k][r];//加上个数
}
tem1+=s/;//标记现在算到哪里,例如1234,一开始t是1230,然后1231,1232,1233,1234,接下来1200,就是1210,1220,1230
}
}
return ans;
} int main()
{
//freopen("in.txt","r",stdin);
int T,l,r,cas = ;
set();//先打表,半打表,将前l位,位数之和是i,并且模上j之后得到k的个数有多少
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&l,&r);
printf("Case %d: %d\n",cas++,solve(r)-solve(l-));
}
return ;
}

自己又写了一遍,虽然都差不多,但是自己写一遍理清了思路

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#define N 10
#define M 82
using namespace std;
int dp[N][M][M][M],g[N];//dp[l][i][j][k]表示前l位的和为i 模上j得数是k的数有多少个
void inti()
{
for(int i=;i<=;i++)
dp[][][i][]=;
//cout<<"ok"<<endl;
for(int l=;l<;l++)//枚举的前l位
for(int i=;i<=l*;i++)//枚举的前l位的和
for(int j=;j<=;j++)//枚举的是你要模的那个数
for(int k=;k<j;k++)//枚举的是模完的结果
for(int x=;x<;x++)//枚举的第l+1位
dp[l+][i+x][j][(k*+x)%j]+=dp[l][i][j][k];
//cout<<"ok"<<endl;
//cout<<"ok"<<endl;
}
int solve(int n)
{
if(!n) return ;
int s,tem1,tem2,sum=,r;
tem1=tem2=n;
s=;
int len=;
while(tem1)
{
g[++len]=tem1%;
tem1/=;
sum+=g[len];
}//分离各位,并且求出来和
int cur=;
if(n%sum==)
cur++;
for(int i=;i<=len;i++)//模拟的是前i位
{
sum-=g[i];//先把这一位清零
tem2/=;
s*=;
tem1=s*tem2;
for(int j=;j<g[i];j++)//枚举的是这个位上的数
{
for(int k=sum+j;k<=sum+j+*(i-);k++)//模拟的是你要模的那个数
{
if(!k) continue;//如果k==0不符合条件
r=tem1%k;
if(r)
r=k-r;
cur+=dp[i-][k-sum-j][k][r];
//cout<<"cur="<<cur<<endl;
//cout<<"dp[i-1][k-sum-j][k][r]="<<dp[i-1][k-sum-j][k][r]<<endl;
}
tem1+=s/;
}
}
return cur;
}
int main()
{
//freopen("in.txt","r",stdin);
//cout<<"ok"<<endl;
inti();
int t,l,r;
scanf("%d",&t);
//cout<<t<<endl;
for(int i=;i<=t;i++)
{
scanf("%d%d",&l,&r);
//cout<<l<<" "<<r<<endl;
printf("Case %d: %d\n",i,solve(r)-solve(l-));
}
return ;
}

HDU X mod f(x)(题解注释)的更多相关文章

  1. HDU - 4389 X mod f(x)(数位dp)

    http://acm.hdu.edu.cn/showproblem.php?pid=4389 题意 为[A,B] 区间内的数能刚好被其位数和整除的数有多少个. 分析 典型的数位dp...比赛时想不出状 ...

  2. 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 ...

  3. HDOJ 4389 X mod f(x)

    数位DP........ X mod f(x) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  4. 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 ...

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

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

  6. 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, ...

  7. HDU 2157 How many ways?? 题解

    题目 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线 ...

  8. HDU 2815 Mod Tree 离散对数 扩张Baby Step Giant Step算法

    联系:http://acm.hdu.edu.cn/showproblem.php?pid=2815 意甲冠军: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...

  9. hdu 2815 Mod Tree (exBSGS)

    http://acm.hdu.edu.cn/showproblem.php?pid=2815 //解 K^D ≡ N mod P #include<map> #include<cma ...

随机推荐

  1. JAVA实现上传文件到服务器、删除服务器文件

    使用的jar包: <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</art ...

  2. 极化码之tal-vardy算法(2)

    上一节我们了解了tal-vardy算法的大致原理,对所要研究的二元输入无记忆对称信道进行了介绍,并着重介绍了能够避免输出爆炸灾难的合并操作,这一节我们来关注信道弱化与强化操作. [1]<Chan ...

  3. LuoguP1196_银河英雄传说_KEY

    银河英雄传说 题目描述 公元5801年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历799年,银河系的两大军事集团在巴米利恩星域爆 ...

  4. WILL吃桃_KEY

    WILL 吃桃 (peach.pas/c/cpp) [ 题目描述] Will 很喜欢吃桃, 某天 Will 来到了一片森林, 森林中有 N 颗桃树, 依次编号为 1,2,„,N.每棵树上有数量不等的桃 ...

  5. 实例说明MVC,MVP,MVVM架构

    很早就知道有这三个概念,但是一直都不清楚是怎么回事,在网上搜索,都是泛泛而谈,没有具体例子,新手是看不懂的,直到找到这篇文章,我对这三个架构有了更清楚的了解. 从一个简单的例子去研究这三个架构. 注意 ...

  6. activemq的安装与使用

    一.activemq的安装 环境:CentOS 6.JDK8 1. 确保系统已安装了可用的jdk版本2. 从网上下载 Linux 版的 ActiveMQ( apache-activemq-5.11.1 ...

  7. uvalive 3135 Argus

    https://vjudge.net/problem/UVALive-3135 题意: 有一个系统有多个指令,每个指令产生一个编号为qnum的时间,每个指令的触发间隔不相同,现在给出若干个指令,现在的 ...

  8. 21.Linux-写USB键盘驱动(详解)

    本节目的: 根据上节写的USB鼠标驱动,来依葫芦画瓢写出键盘驱动 1.首先我们通过上节的代码中修改,来打印下键盘驱动的数据到底是怎样的 先来回忆下,我们之前写的鼠标驱动的id_table是这样: 所以 ...

  9. 基于java的后台截图功能的实现

    Java后台截图功能的实现 背景介绍: 在近期开发的可视化二期项目中的邮件项目中,邮件中的正文中含有图片.该图片的产生是将一些html网页转为图片格式,刚开始考虑使用第三方组件库html2image和 ...

  10. hadoop各个名词的理解

    Hadoop家族的各个成员 hadoop这个词已经流行好多年了,一提到大数据就会想到hadoop,那么hadoop的作用是什么呢? 官方定义:hadoop是一个开发和运行处理大规模数据的软件平台.核心 ...