题目描述

B数的定义:能被13整除且本身包含字符串"13"的数。
例如:130和2613是B数,但是143和2639不是B数。
你的任务是计算1到n之间有多少个数是B数。

输入

输入数据只有一个数,为n。(1<=N<=10^15)

输出

输出数据包含一行,为1到n之间B数的个数。

样例输入

13

样例输出

1


题解

数位dp

由于要求被13整除,因此要记录对13的模数。

由于要包含字符串"13",因此要记录是否出现过字符串"13",同时还要记录首位是什么以便转移。

于是设 $f[i][j][k][0/1]$ 表示 $i$ 位数,对13取模的结果为 $j$ ,首位为 $k$ ,是否包含字符串"13"的数的个数。

直接预处理出 $f$ 数组以及 $10^k$ ,然后数位dp求解即可。

首先算出不满总位数的答案,然后考虑满位数的,那么如果dp的当前位小于原数的当前位则直接计算答案,否则留到下一步处理。这里最好把所求区间转化为 $[1,n+1)$ 的半开半闭区间来求。

细节还算比较少的啦

#include <cstdio>
typedef long long ll;
ll b[17] , f[17][13][10][2];
int main()
{
int i , j , k , l , m , di = 1 , flag = 0;
ll n , now = 0 , ans = 0;
b[0] = f[0][0][0][0] = 1;
for(i = 1 ; i <= 16 ; i ++ )
{
b[i] = b[i - 1] * 10;
for(j = 0 ; j < 13 ; j ++ )
for(k = 0 ; k < 10 ; k ++ )
for(l = 0 ; l < 10 ; l ++ )
for(m = 0 ; m < 2 ; m ++ )
f[i][(j + k * b[i - 1]) % 13][k][m || (k == 1 && l == 3)] += f[i - 1][j][l][m];
}
scanf("%lld" , &n) , n ++ ;
for(i = 1 ; b[i] <= n ; i ++ )
for(j = 1 ; j < 10 ; j ++ )
ans += f[i][0][j][1];
for( ; i ; i -- )
{
for(j = di ; j < n / b[i - 1] % 10 ; j ++ )
ans += f[i][(13 - now * b[i] % 13) % 13][j][1] + (flag || (n / b[i] % 10 == 1 && j == 3)) * f[i][(13 - now * b[i] % 13) % 13][j][0];
now = (now * 10 + n / b[i - 1] % 10) % 13 , di = 0;
if(n / b[i] % 10 == 1 && n / b[i - 1] % 10 == 3) flag = 1;
}
printf("%lld\n" , ans);
return 0;
}

【bzoj5064】B-number 数位dp的更多相关文章

  1. 多校5 HDU5787 K-wolf Number 数位DP

    // 多校5 HDU5787 K-wolf Number 数位DP // dp[pos][a][b][c][d][f] 当前在pos,前四个数分别是a b c d // f 用作标记,当现在枚举的数小 ...

  2. hdu 5898 odd-even number 数位DP

    传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...

  3. codeforces Hill Number 数位dp

    http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits:  5000 MS   Memory Limits: ...

  4. HDU 5787 K-wolf Number 数位DP

    K-wolf Number Problem Description   Alice thinks an integer x is a K-wolf number, if every K adjacen ...

  5. Fzu2109 Mountain Number 数位dp

    Accept: 189    Submit: 461Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description One ...

  6. HDU 3709 Balanced Number (数位DP)

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  7. beautiful number 数位DP codeforces 55D

    题目链接: http://codeforces.com/problemset/problem/55/D 数位DP 题目描述: 一个数能被它每位上的数字整除(0除外),那么它就是beautiful nu ...

  8. FZU - 2109 Mountain Number 数位dp

    Mountain Number One integer number x is called "Mountain Number" if: (1) x>0 and x is a ...

  9. BNU 13024 . Fi Binary Number 数位dp/fibonacci数列

    B. Fi Binary Number     A Fi-binary number is a number that contains only 0 and 1. It does not conta ...

  10. hdu 5898 odd-even number(数位dp)

    Problem Description For a number,if the length of continuous odd digits is even and the length of co ...

随机推荐

  1. 如何使用GeoServer发布地图

    本文所采用的系统为Windows 10 64bit操作系统,使用FireFox浏览器 一.安装配置Java的SDK 1. 安装JavaDevelopment Kit (JDK) 8,java开发环境, ...

  2. Ubentu下命令行安装chrome浏览器

    前言: 最近在使用Ubuntu 系统.编译Android aosp 项目.准备写博客,但是Ubuntu 的默认浏览器 firefox 在写csdn 的时候,加载不出来.如下图 一直卡在这里. 这种情况 ...

  3. onenet基础通信套件加B300移植

    1. 遇到的第一个问题,说是少了文件,但是明明有这个文件的啊? scons: warning: Ignoring missing SConscript 'build_scons\arm\Hi2115\ ...

  4. 移动onenet基础通信套件V1.08版本的AT指令测试

    1. 本次测试版本V1.08,AT+MIPLCREATE,首先需要一个配置文件.该指令创建一个基础通信套件的实例 2. 看下CGFID=2的配置,这个连接类型,UDP是1还是0?用户名和密码是什么?哪 ...

  5. join_tab计算代价

    此路不通,还是需要按照顺序进行计算

  6. Selenium 入门到精通系列:二

    Selenium 入门到精通系列 PS:用户登录 例子 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-04-23 16:12 ...

  7. 怎样用Eclipse将Java源代码生成可执行文件[转]

    eclipse将java源代码生成jar可执行文件 用eclipse做了一个web项目的自动化测试,自己用的时候倒是很方便,打开eclipse直接运行即可,但是分享给其他小伙伴用的时候就不太方便,希望 ...

  8. 在Arch上安装VSCode的方法

    首先去特硬去下载vscode的安装包 mkdir /tmp/vscode cd /tmp/vscode/ wget https://az764295.vo.msecnd.net/public/0.3. ...

  9. Ext JS 6学习文档-第8章-主题和响应式设计

    Ext JS 6学习文档-第8章-主题和响应式设计 主题和响应式设计 本章重点在 ExtJS 应用的主题和响应式设计.主要有以下几点内容: SASS 介绍和入门 主题 响应式设计 SASS 介绍和入门 ...

  10. Java内存管理特点

    Java内存管理特点     Java一个最大的优点就是取消了指针,由垃圾收集器来自动管理内存的回收.程序员不需要通过调用函数来释放内存. 1.Java的内存管理就是对象的分配和释放问题.     在 ...