HDU 3652 B-number(数位DP)

HDU 3652 B-number(数位DP)

大家好,又见面了,我是你们的朋友全栈君。

B-number

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1231    Accepted Submission(s): 651

 

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
 
Author
wqb0039
 
 
题意
找包含13且被13整除的个数。
 
分析
能被13整除,只需要记录%13的值就好。那么如何找包含13的呢,我们需要记录当前最后一位的值,这样才可以从1 –》13。
dp[i][j][k][z]:i:处理的数位,j:该数对13取模以后的值,k:是否已经包含13,z结尾的数
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
int dp[12][15][2][10];
int bit[12];
int dfs(int pos,int num,bool t,int e,bool flag)
{
    if(pos==-1)return t&&(num==0);
    if(!flag && dp[pos][num][t][e]!=-1)
        return dp[pos][num][t][e];
    int end=flag?bit[pos]:9;
    int ans=0;
    for(int i=0;i<=end;i++)
        ans+=dfs(pos-1,(num*10+i)%13,t||(e==1&&i==3),i,flag&&(i==end));
    if(!flag)dp[pos][num][t][e]=ans;
    return ans;
}
int calc(int n)
{
    int pos=0;
    while(n)
    {
        bit[pos++]=n%10;
        n/=10;
    }
    return dfs(pos-1,0,0,0,1);
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n;
    memset(dp,-1,sizeof(dp));
    while(scanf("%d",&n)==1)
    {
        printf("%d\n",calc(n));
    }
    return 0;
}


 

 

转载于:https://www.cnblogs.com/fht-litost/p/8973679.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107552.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • IPtables中SNAT、DNAT和MASQUERADE的含义

    IPtables中SNAT、DNAT和MASQUERADE的含义IPtables中可以灵活的做各种网络地址转换(NAT),网络地址转换主要有两种:SNAT和DNAT。SNAT是sourcenetworkaddresstranslation的缩写,即源地址目标转换。比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP,PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip,当外部网络的服务器比如网站web服务器接到访

    2022年6月15日
    33
  • git安装教程图文详解_git vim命令

    git安装教程图文详解_git vim命令奥力给一、通过Yum源安装#1.卸载旧版本yumremovegit#2.安装yum源的Git版本yuminstall-ygit#3.查看版本gitversion#输出gitversion1.8.3.1#4.查看本文下方的「三、配置全局环境变量」二、通过编译安装#如果没有安装wget则安装yuminstall-ywget2.1下载点击查看最新版本#我这里操作时最新版本为V2.35.1,以下命.

    2025年8月22日
    4
  • Android IBinder的linkToDeath介绍及情景模拟

    最近查看Framework源码的时候,读到了AudioService处理音量的流程,在这里碰到了IBinder的linkToDeath()这个知识点,比较感兴趣,所以记录下来,并自己写demo尝试了一下。我们简单来看下AudioService处理静音这一块。/frameworks/base/media/java/android/media/AudioManager.javapublicclas

    2022年4月9日
    62
  • 计算机全选的键盘,什么是全选快捷键,我将告诉您什么是计算机全选快捷键

    计算机全选的键盘,什么是全选快捷键,我将告诉您什么是计算机全选快捷键在我们的日常工作中,使用快捷键可以提高我们的工作速度,因此我们会记住一些易于使用的快捷键。许在编辑文本时都想使用全选快捷键,但是他们不知道要在键盘上按哪些键。下面,我将向您介绍选择所有快捷键的计算机。经常使用计算机的朋友更加熟悉计算机常用的一些基本快捷键,并且所有人都使用快捷键进行操作,从而提高了工作效率,但是有些新手网民仍然不了解基本的计算机快捷键键,例如选择计算机的快捷键是什么?有些网友不知道…

    2022年5月9日
    77
  • rpm安装gcc

    rpm安装gcc使用原始安装介质,操作系统为RedHatEnterpriseLinuxServerrelease7.4(Maipo)rpm-ivh\gcc-4.8.5-16.el7.x86_64.rpm\cpp-4.8.5-16.el7.x86_64.rpm\glibc-devel-2.17-196.el7.x86_64.rpm\…

    2022年6月12日
    35
  • HTTP_REFERER的用法及伪造

    HTTP_REFERER的用法及伪造

    2021年10月30日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号