转载请注明出处: 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. 新建一个vs2010的MFC工程

    1.在新建mfc工程时Visual C++下的MFC MFC ActiveX Control用来生成MFC ActiveX控件程序 MFC Application用来生成MFC应用程序. MFC DL ...

  2. js页面加载进度条(这个就比较正式了,改改时间就完事儿)

    不废话,直接上代码 思路不难,就是一个animate方法配合随机数 duration内个三秒钟,是自定义的,可以改成页面加载时间,这样就完美了 <!doctype html> <ht ...

  3. WordPress插件制作教程(三): 添加菜单的方法

    上一篇编写了一个简单的插件,让大家对插件的简单制作有个了解,这一篇我们在更深一步,当我们激活插件后后台会显示菜单出来,然后通过单击菜单显示自己定义好的信息.激活之后会在WordPress后台显示一个菜 ...

  4. 学习hadoop

    一.笔记本触摸板关闭方法 1.在windows下有官方驱动. 2.ubuntu下没有 操作方法如下: 1,终端操作 临时禁止触摸板:sudo modprobe -r psmouse 开启触摸板:sud ...

  5. Codeforces 518D Ilya and Escalator

    http://codeforces.com/problemset/problem/518/D 题意:n个人,每秒有p的概率进电梯,求t秒后电梯里人数的期望 考虑dp:f[i][j]代表第i秒有j个人的 ...

  6. BZOJ 1070 修车(最小费用流)

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1070 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术 ...

  7. hex格式介绍及转bin格式的源程序

    Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量.Intel HEX文件经常被用于将程序或数据传输存储到 ...

  8. hex和bin文件格式的区别

    Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量.Intel HEX文件经常被用于将程序或数据传输存储到 ...

  9. 有关 sizeof和strlen的总结

    先看看sizeof() 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操作数可以是 ...

  10. 工具:七牛云备份VPS服务器文件

    每一天,服务器上都会产生一系列的数据文件,有些文件不免具有重要性,但是如果我们只是简单的移动文件,那将不会具有很好的备份性,这里,我们借助Python实现对于文件的云端备份.      这个程序是我利 ...