题目描述

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;
}

转载于:https://www.cnblogs.com/GXZlegend/p/7808062.html

【bzoj5064】B-number 数位dp相关推荐

  1. HDU 3709 Balanced Number (数位DP)

    题意 求出[x, y] 范围内的平衡数,平衡数定义为:以数中某个位为轴心,两边的数的偏移量为矩,数位权重,使得整个数平衡. 思路 外层枚举平衡点,然后数位DP即可.设计状态: dp[pos][o][l ...

  2. fzu 2109 Mountain Number 数位DP

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2109 题意: 如果一个>0的整数x,满足a[2*i+1] >= a[2*i]和a[2*i+2],则 ...

  3. HDU - 3709 Balanced Number(数位dp)

    题目链接:点击查看 题目大意:将一串数字视为天平,两端平衡的数字称为平衡数,并求出一段闭区间中平衡数的个数.所谓的平衡条件即为力臂与 力相乘后两端的数量和可以抵消,例如数字4139可以视为以3为中轴的 ...

  4. HDU odd-even number 数位dp

    题意 在l到r区间内求有多少个符合条件"当前数中所有连续的奇数长度是偶数 所有连续的偶数长度是奇数"的个数 分析 典型的数位dp问题 我们设置dp数组时可以根据 dp[pos][p ...

  5. HDU 5787 wolf Number 数位dp

    题意 题目就是说让我们在l到r的数字中求得有多少个连续k为不相同的数 1≤L≤R≤1e18 2≤K≤5 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  6. CodeForces - 1560F2 Nearest Beautiful Number (hard version)(二分+数位dp)

    题目链接:点击查看 题目大意:给出一个十进制数字 nnn 和一个约束 kkk,问大于等于 nnn 且满足不同的数位个数小于等于 kkk 的最小的数字是多少 题目分析:自己写的贪心太丑了,就不放上来丢人 ...

  7. Mountain Number FZU-2109数位dp

    Mountain NumberFZU-2109 题目大意:一个大于0的数字x,分写成x=a[0]a[1]a[2][3]..a[n]的形式,(比如x=1234,a[0]=1,a[1]=2,a[3]=3, ...

  8. HDU-5197-beautiful number(数位DP)

    beautiful number Problem Description Let A=∑i~n=ai∗10n−i(1≤ai≤9)(n is the number of A's digits). We ...

  9. [POJ3252]Round Number(数位dp)

    题目链接:http://poj.org/problem?id=3252 题意:求范围内数字二进制下0的个数大于等于1的个数的数的个数. 数位dp,dp(l,zero,one,fz)记录当前第l位时0的 ...

最新文章

  1. 学习笔记之xss原理篇
  2. 一次搞定:分布式缓存 Redis 集群搭建!
  3. 任意进制转换简单理解
  4. maven 私服的使用及settings.xml的配置
  5. 百度优化有感,原创内容只是个传说
  6. 学习日报 1028 分支结构 if分支语句
  7. 2016年3-8,哦,好日子
  8. python 调用gpu算力_数据科学家需要算力,GPU 如何实现?-控制器/处理器-与非网...
  9. 向集合中添加Person类型并对其排序
  10. 0031-如何在CDH启用Kerberos的情况下安装及使用Sentry(一)
  11. vue2.0一起在懵逼的海洋里越陷越深(二)
  12. Atitit nosql的艺术 attilax著作 目录 1. 1.5NoSQL数据库的类型 1 1.1. 1.5.1键值(Key/Value)存储 1 1.2. 1.5.2面向文档的数据库 1 1
  13. 4-5. do...while循环
  14. 什么是数据分层,数据分层的作用!
  15. vxworks下gmac调试的总结
  16. 鼠标点击特效(富强,民主,文明,和谐,诚信,友善)
  17. 洛谷 P1710 地铁涨价 (dfs+bfs)
  18. BZOJ 2140: 稳定婚姻 Tarjan Map
  19. 【营销获客二】如何用企业微信搭建私域流量营销平台
  20. python图灵_python图灵机器人

热门文章

  1. django_form表单类
  2. java 抽象类和接口有什么区别
  3. ZooKeeper命令、命令行工具及简单操作
  4. 更新json文件_忽略packagelock.json?
  5. 干货|代码安全审计权威指南(附下载地址)
  6. 干活|常见WAF拦截页面总结
  7. wxpy 实现微信机器人
  8. 【JAVA编码专题】UNICODE,GBK,UTF-8区别
  9. 使用nextInt()等接受输入时必须注意换行符的输入
  10. 未来数据领域的珠穆朗玛峰之中文自然语言处理