LightOJ 1068 Investigation (数位dp)
problem=1068">http://www.lightoj.com/volume_showproblem.php?problem=1068
求出区间[A,B]内能被K整除且各位数字之和也能被K整除的数的个数。(1 ≤ A ≤ B < 231 and 0 < K < 10000)
算是最简单的数位dp了。k在这里是10000。三维数组都开不开。可是想想会发现A,B最多有10位,各位数字之和不会超过90。那么当 k >= 90时,就不用dp,由于个位数字之和对k取余不会等于0。
所以数组仅仅需开到dp[12][90][90]。
#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL __int64
#define eps 1e-12
#define PI acos(-1.0)
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 4010; int dp[15][92][92];
int a,b,k;
int dig[15]; int dfs(int len, int mod1, int mod2, int up)
{
if(len == 0)
return mod1 == 0 && mod2 == 0;
if(!up && dp[len][mod1][mod2] != -1)
return dp[len][mod1][mod2];
int res = 0;
int n = up ? dig[len] : 9;
for(int i = 0; i <= n; i++)
{
int tmod1 = (mod1*10 + i)%k;
int tmod2 = (mod2 + i)%k;
res += dfs(len-1,tmod1,tmod2,up&&i==n);
}
if(!up)
dp[len][mod1][mod2] = res;
return res;
} int cal(int num)
{
int len = 0;
while(num)
{
dig[++len] = num%10;
num /= 10;
}
return dfs(len,0,0,1);
} int main()
{
int test;
scanf("%d",&test);
for(int item = 1; item <= test; item++)
{
scanf("%d %d %d",&a,&b,&k);
if(k >= 90)
{
printf("Case %d: 0\n",item);
continue;
}
memset(dp,-1,sizeof(dp));
printf("Case %d: %d\n",item,cal(b) - cal(a-1));
}
return 0;
}
LightOJ 1068 Investigation (数位dp)的更多相关文章
- lightoj 1068 - Investigation(数位dp)
An integer is divisible by 3 if the sum of its digits is also divisible by 3. For example, 3702 is d ...
- light oj 1068 - Investigation 数位DP
思路:典型的数位DP!!! dp[i][j][k]:第i位,对mod取余为j,数字和对mod取余为k. 注意:由于32位数字和小于95,所以当k>=95时,结果肯定为0. 这样数组就可以开小点, ...
- LightOJ 1140 计数/数位DP 入门
题意: 给出a,b求区间a,b内写下过多少个零 题解:计数问题一般都会牵扯到数位DP,DP我写的少,这道当作入门了,DFS写法有固定的模板可套用 dp[p][count] 代表在p位 且前面出现过co ...
- Investigation LightOJ - 1068
Investigation LightOJ - 1068 常规数位dp题,对于不同k分开记忆化.注意:k大于82(1999999999的数位和)时不会有答案,直接输出0即可.还有,按照这种记录不同k时 ...
- LightOJ 1032 - Fast Bit Calculations 数位DP
http://www.lightoj.com/volume_showproblem.php?problem=1032 题意:问1~N二进制下连续两个1的个数 思路:数位DP,dp[i][j][k]代表 ...
- lightoj 1021 - Painful Bases(数位dp+状压)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1021 题解:简单的数位dp由于总共就只有16个存储一下状态就行了.求各种进制能 ...
- LightOJ1068 Investigation(数位DP)
这题要求区间有多少个模K且各位数之和模K都等于0的数字. 注意到[1,231]这些数最大的各位数之和不会超过90左右,而如果K大于90那么模K的结果肯定不是0,因此K大于90就没有解. 考虑到数据规模 ...
- lightoj 1021 (数位DP)
题意:给你一个b进制的数,再给你一个十进制数k,你可以重新排列b进制数的每一位得到其他b进制数,问你这些数中有多少可以整除k? 思路:数位dp. #include <cstdio> #in ...
- 数位dp(D - How Many Zeroes? LightOJ - 1140 )
题目链接:https://cn.vjudge.net/contest/278036#problem/D 题目大意:T组测试数据,每一次输入两个数,求的是在这个区间里面,有多少个0,比如说19203包括 ...
随机推荐
- query带进度上传插件Uploadify(ASP.NET版本)使用
原文发布时间为:2010-05-13 -- 来源于本人的百度文章 [由搬家工具导入] 本文将带给大家很帅的jquery上传插件,ASP.NET版本的哦,这个插件是Uploadify实现的效果非常不错, ...
- User Experience Collection
about a data driven system front end: 1. about succeeded requests: they do not want to see alerts ab ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---33
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- SaltStack 模块学习之拷贝master服务器上文件和目录到minion服务器
一. cp.get_file实现从master端复制文件到minion服务器的文件中cp.get_file 1. 修改/etc/salt/master ,指定server 工作的根目录 file- ...
- react Native 运行报错之一 gradle-2.14.1-all解压失败的问题
在react-native run-android 时 可能出现压缩包不成功的情况,原因是压缩包失败,需要手动解压到相应目录, 目录:C:\Users\Administrator\.gradle\w ...
- UVA 725 division【暴力枚举】
[题意]:输入正整数n,用0~9这10个数字不重复组成两个五位数abcde和fghij,使得abcde/fghij的商为n,按顺序输出所有结果.如果没有找到则输出“There are no solut ...
- 安全性测试入门 (四):Session Hijacking 用户会话劫持的攻击和防御
本篇继续对于安全性测试话题,结合DVWA进行研习. Session Hijacking用户会话劫持 1. Session和Cookies 这篇严格来说是用户会话劫持诸多情况中的一种,通过会话标识规则来 ...
- Mac下ll、l、la、等简写命令不能使用
Mac默认用的也是Unix系统,Unix系统本身是没有这些简写命令的,可以通过给命令设置别名来使得可以使用这些简写命令 查看本机所有已经设置的命令别名:alias 设置命令别名:alias ll='l ...
- 【好】Paxos以及分布式一致性的学习
Paxos,一言以蔽之,我们需要一种提交协议来确保分布式系统中的全局操作即使是在发生故障的情况下也能保证正确性. 跟拜占庭将军问题是不同的问题,虽然拜占庭也是Lamport提出的.拜占庭里面有叛徒,有 ...
- Youtube深度学习推荐系统论文
https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/45530.pdf https://zh ...