UVA11361 Investigating Div-Sum Property(数位dp)
转载请注明出处: 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)的更多相关文章
- 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 ...
- Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum (数位dp求和)
题目链接:https://codeforces.com/contest/1073/problem/E 题目大意:给定一个区间[l,r],需要求出区间[l,r]内符合数位上的不同数字个数不超过k个的数的 ...
- 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 ...
- Codeforces1073E Segment Sum 【数位DP】
题目分析: 裸的数位DP,注意细节. #include<bits/stdc++.h> using namespace std; ; int k; ][],sz[][],cnt[][]; ] ...
- E. Segment Sum(数位dp)
题意:求一个区间内满足所有数位不同数字个数小于K的数字总和.比如:k=2 1,2,3所有数位的不同数字的个数为1满足,但是123数位上有三个不同的数字,即123不满足. 我们可以使用一个二进制的数 ...
- ACdream 1154 Lowbit Sum (数位DP)
Lowbit Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitSt ...
- Codeforces Round #387 (Div. 2) 747F(数位DP)
题目大意 给出整数k和t,需要产生一个满足以下要求的第k个十六进制数 即十六进制数每一位上的数出现的次数不超过t 首先我们先这样考虑,如果给你了0~f每个数字可以使用的次数num[i],如何求长度为L ...
- ACdreamOJ 1154 Lowbit Sum (数字dp)
ACdreamOJ 1154 Lowbit Sum (数位dp) ACM 题目地址:pid=1154" target="_blank" style="color ...
- 【数位dp】UVA - 11361 - Investigating Div-Sum Property
经典数位dp!而且这好像是数位dp的套路板子……不需要讨论原来我很头疼的一些边界. 改天用这个板子重做一下原来的一些数位dp题目. http://blog.csdn.net/the_useless/a ...
随机推荐
- C++访问声明
代码: #include <iostream> #include <string> using namespace std; struct B{ private: int s; ...
- java基础知识再学习--集合框架-对象的强、软、弱和虚引用
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473/53092 本文 ...
- python的and与or剖析
1.只含有and的表达式 In []: and True and ' Out[]: ' In []: and and True and 'long' Out[]: 从左向右,遇到False,则返回改值 ...
- The Time in Words
def main(): time = ["one", "two", "three", "four", "fiv ...
- (转)Autotrace工具使用——小工具,大用场
监控SQL语句,获取执行计划和执行成本,是每个Oracle开发人员与DBA所必须具备的能力之一. 当Oracle彻底进入CBO时代,我们面对一种全新的局面.一方面,基于数据统计量的CBO优化器,让SQ ...
- Qt自定义圆周动画(360 10.0 的模仿作者写的)
由于项目需求,需要把一张图片做圆周运动,用到了属性动画,坐标计算等. 在编写代码的过程中,由于太长时间没用sin,cos函数忘了是用弧度为单位,汗呀 下面把代码贴出来 /* * 圆周运动动画 * */ ...
- Node.js 和Socket.IO 实现chat WEBIM
socket官方: http://socket.io/ 需求:实现WEB IM功能,数据从服务器PUSH 不是PULL websocket是基于HTML5的新特性,不兼容IE6,7,8 .. ...
- Windows下AndroidStudio 中使用Git(AndroidStudio项目于GitHub关联)
前提条件 : 1. 安装 Git 客户端 下载链接 2. 有 GitHub 账号 (假设你已经有了一些git基础, 如果还一点都不会, 请去找其他加成学习) AndroidStudio项目发布到Git ...
- print带参数格式
string_1 = "Camelot" string_2 = "place" print("float:%lf. int:%d string:%s. ...
- Colorful Lecture Note(手工栈)
题目1 : Colorful Lecture Note 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi is writing an algorithm ...