转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud

题目意思:问在区间[A,B]有多少个数不仅满足自身是k的倍数,而且其各个位数上的和(十进制)也是k的倍数。

分析:数位dp

首先注意到1+9*9=82,即k最大只能是82,所以,在大于82是直接输出答案为0;

dp[i][j][t]——表示从左往右递推到第i位时(后面所有位数用0填充),各个位数上的和mod k等于j,且这个数mod k等于t时的方案数

状态转移方程为dp[i][j][t]=∑dp[i-1][((j-x)%k+k)%k][((t-x*10^i)%k+k)%k]  (x=0,1,2,……,9)

注意递推的时候相应的位次上是有限制的,并且不要忘记判断其自身

 #include <iostream>
#include <cstring>
using namespace std;
int k;
int d[];
int p[];
int dp[][][];
int dfs(int size,int n,int m)
{
if(!size)
{
if(n==&&m==)return ;
return ;
}
if(dp[size][n][m]>=)return dp[size][n][m];
dp[size][n][m]=;
for(int i=;i<;i++)
{
dp[size][n][m]+=dfs(size-,((n-i)%k+k)%k,((m-i*p[size-])%k+k)%k);
}
return dp[size][n][m];
}
int solve(int num)
{
int n=,m=,size=,ans=;
if(num==)return ;
while(num)
{
d[size++]=num%;
temp+=d[size-];
num/=;
}
d[]++;
for(int i=size-;i>=;i--)
{
for(int j=;j<d[i];j++)
{
ans+=dfs(i,((k-n-j)%k+k)%k,((k-m-j*p[i])%k+k)%k);
}
n=(n+d[i])%k;
m=(m+d[i]*p[i])%k; }
return ans; } int main()
{
ios::sync_with_stdio(false);
p[]=;
for(int i=;i<;i++)p[i]=p[i-]*;
int a,b,t;
cin>>t;
while(t--)
{
cin>>a>>b>>k;
if(k>)cout<<<<endl;
else
{
memset(dp,-,sizeof(dp));
cout<<solve(b)-solve(a-)<<endl;
}
}
return ;
}

UVA11361 Investigating Div-Sum Property(数位dp)的更多相关文章

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

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

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

  3. CodeForces - 1073E :Segment Sum (数位DP)

    You are given two integers l l and r r (l≤r l≤r ). Your task is to calculate the sum of numbers from ...

  4. Codeforces1073E Segment Sum 【数位DP】

    题目分析: 裸的数位DP,注意细节. #include<bits/stdc++.h> using namespace std; ; int k; ][],sz[][],cnt[][]; ] ...

  5. E. Segment Sum(数位dp)

    题意:求一个区间内满足所有数位不同数字个数小于K的数字总和.比如:k=2   1,2,3所有数位的不同数字的个数为1满足,但是123数位上有三个不同的数字,即123不满足. 我们可以使用一个二进制的数 ...

  6. ACdream 1154 Lowbit Sum (数位DP)

    Lowbit Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitSt ...

  7. Codeforces Round #387 (Div. 2) 747F(数位DP)

    题目大意 给出整数k和t,需要产生一个满足以下要求的第k个十六进制数 即十六进制数每一位上的数出现的次数不超过t 首先我们先这样考虑,如果给你了0~f每个数字可以使用的次数num[i],如何求长度为L ...

  8. ACdreamOJ 1154 Lowbit Sum (数字dp)

    ACdreamOJ 1154 Lowbit Sum (数位dp) ACM 题目地址:pid=1154" target="_blank" style="color ...

  9. 【数位dp】UVA - 11361 - Investigating Div-Sum Property

    经典数位dp!而且这好像是数位dp的套路板子……不需要讨论原来我很头疼的一些边界. 改天用这个板子重做一下原来的一些数位dp题目. http://blog.csdn.net/the_useless/a ...

随机推荐

  1. libevent使用之安装(一)

    1.下载安装包,在官网http://www.monkey.org/~provos/libevent/下载 2.解压 运行命令: tar zxvf libevent-2.0.10-stable.tar. ...

  2. 解决ligerUI服务器分页Total不起作用的问题

    Js代码:   $('#userTable').ligerGrid({ width:'100%', height:'100%', title:'用户列表', //url:'', dataAction: ...

  3. [HDU] 3711 Binary Number [位运算]

    Binary Number Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  4. wapPush

    短信推送:wapPsuh简介

  5. 【转】GCC4.6编译的warning -Werror

    原文网址:http://blog.sina.com.cn/s/blog_605f5b4f0101bct7.html New warnings for unused variables and para ...

  6. ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase

    原文地址:http://www.51csharp.com/MVC/882.html   ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL 引言-- 在初级篇中,我们 ...

  7. Python Open Flash Chart (pyOFC2) — Home

    Python Open Flash Chart (pyOFC2) - Home pyOFC2 Python Open Flash Chart 2

  8. PHP 后台程序配置config文件,及form表单上传文件

    一,配置config文件 1获取config.php文件数组, 2获取form 表单提交的值 3保存更新config.php文件,代码如下: $color=$_POST['color']; $back ...

  9. 【转】使用miniupnpd-->upnp协议 映射本地端口到外网

    miniupnpc的主要函数介绍 1>.miniupnpc库主要使用的头文件有 #include"miniwget.h" #include"miniupnpc.h& ...

  10. CharacterController 角色控制器实现移动和跳跃

    之前我使用SimpleMove来控制角色的移动, 后来又想实现人物的跳跃, 看见圣典里面是使用Move来实现的. =.= 然后我都把他们改成move来实现了 代码实现: using UnityEngi ...