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. IDEA用maven创建springMVC项目和配置

    工具准备:IDEA2016.3 Java jdk 1.8 1.DEA创建项目 新建一个maven project,并且选择webapp原型.  然后点击next  这里的GroupId和Artifac ...

  2. C++ Primer Plus 6 第一章

    一.机器语言.汇编语言.C\C++.高级语言 机器语言:机器真正识别,能在机器上运行的语言. 汇编语言:低级语言,直接操作硬件,如直接访问cpu寄存器和内存单元.不具有移植性.因为不同的平台对应的硬件 ...

  3. Dubbo服务接口的设计原则

    1.接口粒度 1.1 服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo暂未提供分布式事务支持.同时可以减少系统间的网络交互. 1.2 服务 ...

  4. MySQL Base

    /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 ---> input pwd /* 数据库存贮引擎 */    InnoDB :        1) ...

  5. MVC3/4/5/6 布局页及Razor语法及Route路由配置

    一.目录结构 二.Razor语法 代码块:@{},如:@{Html.Raw(“”);} @if(){} @switch(){} @for(){} @foreach(){} @while(){} @do ...

  6. Python调用C# Com dll组件实战

    之前公司有套C# AES加解密方案,但是方案加密用的是Rijndael类,而非AES的四种模式(ECB.CBC.CFB.OFB,这四种用的是RijndaelManaged类),Python下Crypt ...

  7. asp.net mvc 自动化测试工具

    好久不写文章了,一直忙在项目中. 前一阵发现公司一个项目,体积巨大.业务很复杂.基于历史原因,项目基于mvc 2迁移过来,视图大多还是aspx  作为视图承载. 控制器中的方法  更是一个比一个多. ...

  8. 给tableView设置headerView时遇到的问题

    在ViewDidLoad里面设置了 self.tableView.tableHeaderView = 自定义的View 然后在模拟器上运行后,发现这个HeaderView挡住了后面的Cell,也就是c ...

  9. MVC使用jQuery从视图向控制器传递Model,数据验证,MVC HTML辅助方法小结

    //MVC HTML辅助类常用方法记录 (1)@Html.DisplayNameFor(model => model.Title)是显示列名, (2)@Html.DisplayFor(model ...

  10. PPLB条码打印

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...