hdu 3652 B-number

Problem Description
A wqb-number, or B-number for short, is a non-negative integer whose decimal form contains the sub- string “13” and can be divided by 13. For example, 130 and 2613 are wqb-numbers, but 143 and 2639 are not. Your task is to calculate how many wqb-numbers from 1 to n for a given integer n.

Input
Process till EOF. In each line, there is one positive integer n(1 <= n <= 1000000000).

Output
Print each answer in a single line.

Sample Input

13
100
200
1000

Sample Output

1
1
2
2

参考了Qiuqiqiu特别是递推中使用的加法来mod(开始我使用的是减法,很难看)下面是我的总结;
思路:
1. 和3555Bomb一样,要含有13,可知第二维要表示是否含13,首位是否为3以及已经含13三种,还有一个就是整除问题;拓展一维来表示余数,其余的一样操作;当最高位为0时,表示所有小于n位数的数符合的情况,所以在高位相同,且高位中已经含有 ‘13’时直接加不含 ‘13’的个数即可;
2. **当第i位为1时,由求的是小于n的所有符合数可知在模拟第i位时只会模拟到0,那么加的只是f[i-1][2][]的所有符合的情况;那这个1一定要浪费吗?当你是取i-1位从0~9时,答案是的。但是当只要存在13时(整除在三维中模拟),还要看后一位是否大于3….(特别的地方);

#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int (i) = 0;i < (n);i++)
int f[][][];
int bit[];
void init()
{
memset(f,,sizeof(f));
bit[] = ;
for(int i = ;i < ;i++) bit[i] = bit[i-]*%;
f[][][] = ;
for(int i = ;i <= ;i++)
for(int k = ;k < ;k++){//直接按照需要的数来递推
for(int j = ;j <= ;j++)
f[i+][][(k+j*bit[i+])%] += f[i][][k];
f[i+][][(k+bit[i+])%] -= f[i][][k];
f[i+][][(k+bit[i+]*)%] += f[i][][k];//指定来加~~;
f[i+][][(k+bit[i+])%] += f[i][][k];
for(int j = ;j <= ;j++)
f[i+][][(k+bit[i+]*j)%] += f[i][][k];
}
}
int query(int n)
{
int d[]={},tot = ;
while(n){
d[++tot] = n % ;
n /= ;
}
int ans = ,mod = ,flag = ;
for(int i = tot;i > ;mod = (mod + d[i]*bit[i])%,i--){
for(int j = ;j < d[i];j++)
ans += f[i-][][( - (mod + j*bit[i])%)%];
if(flag){
for(int k = ;k < d[i];k++){
ans += f[i-][][( - (mod + k * bit[i])%)%];
}
continue;
}
if(d[i] > ) ans += f[i-][][( - (mod + bit[i])%)%];
if(d[i+] == && d[i] > ) ans += f[i][][(-mod)%];
if(d[i+] == && d[i] == ) flag = ;
}
return ans;
}
int main()
{
init();
int n;
while(scanf("%d",&n) == ){
printf("%d\n",query(n+));
}
}
 

数位DP入门之hdu 3652 B-number的更多相关文章

  1. 数位DP入门之hdu 3555 Bomb

    hdu 3555 Bomb 题意: 在1~N(1<=N<=2^63-1)范围内找出含有 ‘49’的数的个数: 与hdu 2089 不要62的区别:2089是找不不含 '4'和 '62'的区 ...

  2. HDU 2089 不要62【数位DP入门题】

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. hdu3555 Bomb 数位DP入门

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 简单的数位DP入门题目 思路和hdu2089基本一样 直接贴代码了,代码里有详细的注释 代码: ...

  4. xbz分组题B 吉利数字 数位dp入门

    B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第 ...

  5. 数位dp入门 hdu2089 不要62

    数位dp入门 hdu2089 不要62 题意: 给定一个区间[n,m] (0< n ≤ m<1000000),找出不含4和'62'的数的个数 (ps:开始以为直接暴力可以..貌似可以,但是 ...

  6. HDU 2089 - 不要62 - [数位DP][入门题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...

  7. HDU 2089 不要62(数位dp入门)

    题意:统计区间 [a,b] 中不含 4 和 62 的数字有多少个. 题解:这是数位DP的入门题了,首先要理解数DP的原理,DP[i][j]:代表第i位的第j值,举个栗子:如4715   数位数是从右向 ...

  8. Hdu 2089 不要62 (数位dp入门题目)

    题目链接: Hdu 2089 不要62 题目描述: 给一个区间 [L, R] ,问区间内不含有4和62的数字有多少个? 解题思路: 以前也做过这个题目,但是空间复杂度是n.如果数据范围太大就GG了.今 ...

  9. 数位dp入门 HDU 2089 HDU 3555

    最基本的一类数位dp题,题目大意一般是在a~b的范围,满足某些要求的数字有多少个,而这些要求一般都是要包含或者不包含某些数字,或者一些带着数字性质的要求,一般来说暴力是可以解决这一类问题,可是当范围非 ...

随机推荐

  1. 2假动作,数据缓冲,CCEaseExponential,CCEaseElastic,CCEaseBounce,CCCallFunc,funcNCallBack,funcNDCallBack,funcO

     1 缓冲动作 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/4 ...

  2. Struts2学习笔记1

     一.下载struts2.0.1 http://struts.apache.org/downloads.html,下载struts-2.0.1-all.zip,这个压缩包中包括了开发struts2所需 ...

  3. linux ssh 中在window 传文件 下载文件 工具

    centos 安装工具 yum install lrzsz

  4. linux系统磁盘分区之parted

    对于linux的分区通常可以使用fdisk命令工具和parted工具 对于分区表通常有MBR分区表和GPT分区表 对于磁盘大小小于2T的磁盘,我们可以使用fdisk和parted命令工具进行分区 对于 ...

  5. c# 可以有多个Main()函数

    可以有多个Main()函数,这样写:namespace ConsoleApp1{class Program{static void Main(string[] args){Console.WriteL ...

  6. QT显示输出及其桌面

      /* 应用程序桌面 */ QDesktopWidget* desktop = QApplication::desktop(); /* 指定显示器的屏幕尺寸(1024 * 768) */ QRect ...

  7. hibernate缓存技术

    1.缓存 2.Hibernate 缓存作用:为了提高查询效率. 3.第一次操作某个对象的时候,把操作的对象数据存储到缓存中,然后下一次在对同一个对象操作的时候,就不会在连接数据库. 4.Hiberna ...

  8. Qt Quick 简单教程 - 1 (代码备忘)

    qmlscene 未安装 由于出现上面的情况,我开始转战Windows 下学习,昨天安装好了Qt Sdk了,哟吼吼吼. mail.qml内容: import QtQuick 2.3 import Qt ...

  9. js事件模型

    连接在此 http://www.cnblogs.com/zqstc/archive/2009/11/26/1611464.html

  10. 取caml查询结果的前多少行

    取查询结果的前多少行的方法?spQuery.RowLimit = 1;             SPList list = SPContext.Current.Web.Lists[ListNames. ...