hdu3652 数位dp(含13且被能被13整除的数)

http://acm.hdu.edu.cn/showproblem.php?pid=3652

B-number

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 2815    Accepted Submission(s): 1552

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
/***
hdu 3652  数位dp(含13且被能被13整除的数)
题目大意:求出给定区间内的数字含有“13”并且能被13整除的个数
解题思路:记忆化搜索。
           dp[i][j][k][z]:i:处理的数位,j:该数对13取模以后的值,k:是否已经包含13,z结尾的数
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;

int dp[10][15][2][10],bit[10];

int dfs(int pos,int mod,int t,int now,int flag)
{
    if(pos==-1)return mod==0&&t;
    if(!flag&&dp[pos][mod][t][now]!=-1)return dp[pos][mod][t][now];
    int end=flag?bit[pos]:9;
    int ans=0;
    for(int i=0;i<=end;i++)
    {
        ans+=dfs(pos-1,(mod*10+i)%13,t||(now==1&&i==3),i,flag&&(i==end));
    }
    if(!flag)dp[pos][mod][t][now]=ans;
    return ans;
}

int solve(int n)
{
    int len=0;
    while(n)
    {
        bit[len++]=n%10;
        n/=10;
    }
    return dfs(len-1,0,0,0,1);
}

int main()
{
    int n;
    memset(dp,-1,sizeof(dp));
    while(~scanf("%d",&n))
    {
        printf("%d\n",solve(n));
    }
    return 0;
}
时间: 2024-12-25 19:15:45

hdu3652 数位dp(含13且被能被13整除的数)的相关文章

C 输入一串数字,去掉其中含7的和能被7整除的数

C 输入一串数字,去掉其中含7的和能被7整除的数,每个数小于10000,数字个数小于100 输入例子:1,7,56,77,87,2,45,42,97,9977 输出:1,2,45 注意:输入个数不确定,所以不能够用整形数组处理,不能以判断整形数组元素是否等于\n为结束,因为数组是整形的,\n是字符型的,是输入不进去的 所以要用字符串来处理,先把用逗号相隔的所有整数取出来,然后再对这些数进行判断输出 #include<stdio.h> #include<string.h> void

C 输入一串数字,去掉当中含7的和能被7整除的数

C 输入一串数字,去掉当中含7的和能被7整除的数,每一个数小于10000,数字个数小于100 输入样例:1,7,56,77,87,2,45,42,97,9977 输出:1,2,45 注意:输入个数不确定.所以不可以用整形数组处理.不能以推断整形数组元素是否等于\n为结束,由于数组是整形的.\n是字符型的,是输入不进去的 所以要用字符串来处理,先把用逗号相隔的全部整数取出来,然后再对这些数进行推断输出 #include<stdio.h> #include<string.h> void

hdu3652 数位dp

dp[i][j][k]  i-i位数,j-开头是j,k-除13的余数 要注意数位dp的时候一定不能直接判断对的来做,必须是判断不对的,然后用全部减 这一题先算出所有%13==0的个数,然后算出所以%13并且不含13的个数,然后相减就是答案了 #include<bits/stdc++.h> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 2520 #define ls l,m,rt<

hdu3652 数位dp记忆化搜索

从未见过的船新版本数位dp,,省去了预处理过程,直接进行计算 #include<bits/stdc++.h> using namespace std; #define ll long long int dp[20][20][5],n,len,bit[20]; //dp[i][j][k]:到i位数,前面模13=j,前面是1|不是1|有13的状态已经确定,后面的数的个数 //mod:前面%13的余数,flag=0|1|2:pos+1位不是1|是1|有13出现过了,lim:数的限制 int dfs(

HDU 2089 数位dp入门

开始学习数位dp...一道昨天看过代码思想的题今天打了近两个小时..最后还是看了别人的代码找bug...(丢丢) 传说院赛要取消 ? ... 这么菜不出去丢人也好吧~ #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> #include<queue> using namespace std; int n,m; /

hdu 3652数位dp

/* 数位dp 题意:找到1-n之间包含13这个子串并且能够整除13的数 解:刚开始dp[N][N][2]这里的2用来记录是否为13表示当前位是否为13,我把上一位为1当前位为13和上一位部位1 这种情况在数组中没有记录. */ #include<stdio.h> #include<string.h> #define N 14 int dp[N][N][3]; int digit[N]; int dfs(int len,int mod,int cnt,int ok) { if(!l

【数位DP】Codeforces Gym 100418J Lucky tickets

题意: 设性质P:一个数能够整除它二进制表示下的1的个数.求[1,N]中满足性质P的数的个数.N<=1019. 思路: 数位DP.首先这个数最多有64位,我们可以枚举1的个数x,然后求可以整除x的数的个数.设dp[i][j][k][w]表示从最高位枚举到i位,现在已经构成的数模x余多少(这里是关键,只用考虑余数),现在已经用了k个1,w=0表示现在枚举的这个数已经小于N了,w=1表示从最高位到第i位都与N相同(数位dp计算时的方法:如果当前枚举的数小于N了,那么枚举的这一位就可以任意,如果等于N

BZOJ 3209 花神的数论题 数位DP+数论

题目大意:令Sum(i)为i在二进制下1的个数 求∏(1<=i<=n)Sum(i) 一道很简单的数位DP 首先我们打表打出组合数 然后利用数位DP统计出二进制下1的个数为x的数的数量 最后输出∏(1<=x<=logn)x^ans[x]即可 此题的坑在于这题的组合数和数位DP的结果都是指数 对指数取模不能直接取 要取Phi(p) 于是我们对10000006取模 然后这题就WA了 因为10000007不是个质数! 10000007=941*10627 于是我们得到Phi(p)=940*

hdu 2089 入手数位dp问题

数位dp解决的问题是指求在一段数的区间里面 满足条件的数的个数 核心为两点 http://wenku.baidu.com/link?url=tpfIYzhx_MzevpIM58UZ66pr-87MCFPKTMKFdGDi5jUqyO9ckti0mY6diSz2PZEL_ZBhd2zIbhus1mnzDiAO1B5K2Vu38YDsqjmOvYKFT6q 我自己总结下吧 第一 是dp的状态转移方程 dp[i][j] 表示的是以j开头的i位数 满足条件的个数为多少 既然是要记录满足条件的个 那么 d