【数位dp】UVA - 11361 - Investigating Div-Sum Property
经典数位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的更多相关文章
- UVa 11361 - Investigating Div-Sum Property
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- 数位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 ...
- 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 ...
- 数位dp总结 之 从入门到模板
转发自WUST_WenHao巨巨的博客 基础篇 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数.所谓数位dp,字面意思就是在数位上进行dp咯.数位还算是比较好听 ...
- 数位dp相关
经典的数位Dp是要求统计符合限制的数字的个数. 一般的形式是:求区间[n,m]满足限制f(1). f(2). f(3)等等的数字的数量是多少. 条件 f(i) 一般与数的大小无关,而与数的组成有关. ...
- 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 ...
- UVA11361 Investigating Div-Sum Property(数位dp)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 题目意思:问在区间[A,B]有多少个数不仅满足自身是k的倍数,而且其各个位数上的和 ...
- Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum (数位dp求和)
题目链接:https://codeforces.com/contest/1073/problem/E 题目大意:给定一个区间[l,r],需要求出区间[l,r]内符合数位上的不同数字个数不超过k个的数的 ...
- UVa 1009 Sharing Chocolate (数位dp)
题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...
随机推荐
- 20、redis和memcached比较?
1.Redis和Memcache都是将数据存放在内存中,都是内存数据库.不过memcache还可用于缓存其他东西,例如图片.视频等等: 2.Redis不仅仅支持简单的k/v类型的数据,同时还提供lis ...
- CSS浮动和清除
float:让元素浮动,取值:left(左浮动).right(右浮动) clear:清除浮动,取值:left(清除左浮动).right(清除右浮动).both(同时清除上面的左浮动和右浮动) 1.CS ...
- java8新特性视频、spring4.0视频讲解,javaee基础知识讲解等网址汇总
1.http://ke.atguigu.com/ 海量视频首页 2.http://ke.atguigu.com/course/56 java8新特性学习地址
- Python构造函数使用
1. 子类不定义构造函数时候,默认引用父类构造函数 class A(object): def __init__(self,name): self.name = name def run(self): ...
- python manage.py 命令
在用命令django‐admin.py startproject <工程目录>建立一个django工程文件时,会生成一个manage.py文件,那么这个manage.py到底可以干嘛呢? ...
- 在ie10中如何禁用输入框中的小眼睛 与 叉叉 删除按钮
修改本地组策略,禁用密码输入框中的密码显示: 切换成IE兼容模式:(此方法仅在Windows 7下有效,Windows 8无效) 那是系统自己支持的,有时候很方便,有时候会影响文本框里的文本,提供一个 ...
- rabbitmq源码安装及配置文件管理
rabbitmq 源码安装 官网地址:rabbitmq http://www.rabbitmq.com/releases/rabbitmq-server/ 官网地址:erlang http://erl ...
- php文件上传错误信息
错误信息说明 UPLOAD_ERR_OK:其值为0,没有错误发生,文件上传成功 UPLOAD_ERR_INI_SIZE:其值为1,上传的文件超过了php.ini和upload_max_filesize ...
- 邂逅Sass和Compass之Sass篇
对于一个从后台转到前端的web开发者来说,最大的麻烦就是写CSS,了解CSS的人都知道,它可以开发网页样式,但是没法用它编程,感觉耦合性相当的高,如果想要方便以后维护,只能逐句修改甚至重写相当一部分的 ...
- linux下c获取时间
头文件 #include "sys/time.h" 结构体 struct timezone { int tz_minuteswest; /*格林威治时间往西方的时差*/ int t ...