经典数位dp!而且这好像是数位dp的套路板子……不需要讨论原来我很头疼的一些边界。

改天用这个板子重做一下原来的一些数位dp题目。

http://blog.csdn.net/the_useless/article/details/53674906

题目大意:

给定a,b,k三个正整数,统计在[a,b]之间的整数n中,有多少n自身是k的倍数,且n的各个数字(十进制)之和也是k的倍数.(1⩽a⩽b⩽231)

题目分析:

这是一道典型的数位DP题. 
n非常大,若是直接枚举的话会超时,考虑利用加法原理计算方案数. 
将数拆分开来,拆成一位一位的,从前往后枚举.那么就会出现形如”32**”这样枚举了部分,还有部分未枚举.可以用三维状态来表示:f(d,m1,m2)表示当前还有d个数未枚举,m1表示前缀各数之和%k,m2表示组成数%k.如之前的数”32**”就应该对应为f(2,5%k,3200%k). 
对应的转移方程则有

f(d,m1,m2)=∑f(d−1,(m1+i)%k,m2+i∗10d−1%k|0⩽i⩽9)

所以dp数组需要开多大.10∗10000∗10000≈109?开不下! 
但是其实各个位数之和最大为1+9∗9=82,所以当k>82时,直接输出0.

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int a,b,MOD,T;
int dp[15][90][90],pow_10[15];
int f(int d,int m1,int m2){
if(dp[d][m1][m2]!=-1){
return dp[d][m1][m2];
}
dp[d][m1][m2]=0;
for(int i=0;i<10;i++){
dp[d][m1][m2]+=f(d-1,(m1+i)%MOD,(m2+i*pow_10[d-1])%MOD);
}
return dp[d][m1][m2];
}
int calc(int x)
{
int len=0;
if(!x){
len=1;
}
int t=x;
while(t){
++len;
t/=10;
}
int res=0,LeftSide=0,SumDigits=0;//LeftSideÊǵ±Ç°×ó±ß½ç£¬SumDigitsÊǵ±Ç°ËùÓÐÊýλ֮ºÍ
for(int i=1;i<=len;i++) {
while((ll)LeftSide+(ll)pow_10[len-i]-1ll<=(ll)x){
//ÅжÏÄÜ·ñ´ÓÕâÀï¼ÌÐøÍùÏÂÇó£¬ÒªÊDz»ÄܵĻ°¾ÍÒªÍùºóÍÆһλ
//±ÈÈç3212£¬Äã¾Í²»ÄÜ´Ó3200ÔÙÍù3299Ç󣬶øÓ¦¸ÃÍùºóÍƵ½Íù3209Çó
res+=f(len-i,SumDigits%MOD,LeftSide%MOD);
LeftSide+=pow_10[len-i];
++SumDigits;
}
}
return res;
}
int main(){
// freopen("uvaLive4123.in","r",stdin);
scanf("%d",&T);
pow_10[0]=1;
for(int i=1;i<=9;++i){
pow_10[i]=pow_10[i-1]*10;
}
for(;T;--T){
scanf("%d%d%d",&a,&b,&MOD);
if(MOD>82){
puts("0");
continue;
}
memset(dp,-1,sizeof(dp));
for(int i=0;i<MOD;++i){
for(int j=0;j<MOD;++j){
dp[0][i][j]=0;
}
}
dp[0][0][0]=1;
printf("%d\n",calc(b)-calc(a-1));
}
return 0;
}

【数位dp】UVA - 11361 - Investigating Div-Sum Property的更多相关文章

  1. UVa 11361 - Investigating Div-Sum Property

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  2. 数位DP:SPOJ KPSUM - The Sum

    KPSUM - The Sum One of your friends wrote numbers 1, 2, 3, ..., N on the sheet of paper. After that ...

  3. UVA 11361 - Investigating Div-Sum Property 数位DP

    An integer is divisible by 3 if the sum of its digits is also divisible by 3. For example, 3702 is d ...

  4. 数位dp总结 之 从入门到模板

    转发自WUST_WenHao巨巨的博客 基础篇 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数.所谓数位dp,字面意思就是在数位上进行dp咯.数位还算是比较好听 ...

  5. 数位dp相关

    经典的数位Dp是要求统计符合限制的数字的个数. 一般的形式是:求区间[n,m]满足限制f(1). f(2). f(3)等等的数字的数量是多少. 条件 f(i) 一般与数的大小无关,而与数的组成有关. ...

  6. Investigating Div-Sum Property UVA - 11361

    An integer is divisible by 3 if the sum of its digits is also divisible by 3. For example, 3702 is d ...

  7. UVA11361 Investigating Div-Sum Property(数位dp)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 题目意思:问在区间[A,B]有多少个数不仅满足自身是k的倍数,而且其各个位数上的和 ...

  8. Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum (数位dp求和)

    题目链接:https://codeforces.com/contest/1073/problem/E 题目大意:给定一个区间[l,r],需要求出区间[l,r]内符合数位上的不同数字个数不超过k个的数的 ...

  9. UVa 1009 Sharing Chocolate (数位dp)

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

随机推荐

  1. 20、redis和memcached比较?

    1.Redis和Memcache都是将数据存放在内存中,都是内存数据库.不过memcache还可用于缓存其他东西,例如图片.视频等等: 2.Redis不仅仅支持简单的k/v类型的数据,同时还提供lis ...

  2. CSS浮动和清除

    float:让元素浮动,取值:left(左浮动).right(右浮动) clear:清除浮动,取值:left(清除左浮动).right(清除右浮动).both(同时清除上面的左浮动和右浮动) 1.CS ...

  3. java8新特性视频、spring4.0视频讲解,javaee基础知识讲解等网址汇总

    1.http://ke.atguigu.com/     海量视频首页 2.http://ke.atguigu.com/course/56    java8新特性学习地址

  4. Python构造函数使用

    1. 子类不定义构造函数时候,默认引用父类构造函数 class A(object): def __init__(self,name): self.name = name def run(self): ...

  5. python manage.py 命令

    在用命令django‐admin.py startproject <工程目录>建立一个django工程文件时,会生成一个manage.py文件,那么这个manage.py到底可以干嘛呢? ...

  6. 在ie10中如何禁用输入框中的小眼睛 与 叉叉 删除按钮

    修改本地组策略,禁用密码输入框中的密码显示: 切换成IE兼容模式:(此方法仅在Windows 7下有效,Windows 8无效) 那是系统自己支持的,有时候很方便,有时候会影响文本框里的文本,提供一个 ...

  7. rabbitmq源码安装及配置文件管理

    rabbitmq 源码安装 官网地址:rabbitmq http://www.rabbitmq.com/releases/rabbitmq-server/ 官网地址:erlang http://erl ...

  8. php文件上传错误信息

    错误信息说明 UPLOAD_ERR_OK:其值为0,没有错误发生,文件上传成功 UPLOAD_ERR_INI_SIZE:其值为1,上传的文件超过了php.ini和upload_max_filesize ...

  9. 邂逅Sass和Compass之Sass篇

    对于一个从后台转到前端的web开发者来说,最大的麻烦就是写CSS,了解CSS的人都知道,它可以开发网页样式,但是没法用它编程,感觉耦合性相当的高,如果想要方便以后维护,只能逐句修改甚至重写相当一部分的 ...

  10. linux下c获取时间

    头文件 #include "sys/time.h" 结构体 struct timezone { int tz_minuteswest; /*格林威治时间往西方的时差*/ int t ...