【hdu4734】F(x) 数位dp
题目描述
对于一个非负整数 $x=\overline{a_na_{n-1}...a_2a_1}$ ,设 $F(x)=a_n·2^{n-1}+a_{n-1}·2^{n-2}+...+a_2·2^1+a_1·2^0=\sum\limits_{i=1}^na_i·2^{i-1}$
多次询问 $[0,B]$ 区间内 $F$ 值小于等于 $F(A)$ 的数的个数。
输入
The first line has a number T (T <= 10000) , indicating the number of test cases.
For each test case, there are two numbers A and B (0 <= A,B < 109)
输出
For every case,you should output "Case #t: " at first, without quotes. The t is the case number starting from 1. Then output the answer.
样例输入
0 100
1 10
5 100
样例输出
Case #1: 1
Case #2: 2
Case #3: 13
题解
数位dp
考虑到最大的 $F(x)=F(999999999)=9207$ ,因此可以设 $f[i][j][k]$ 表示 $i$ 位数,最高位为 $j$ ,$F$函数的值为 $k$ 的数的个数。
首先预处理出 $f$ 数组,考虑当前位的贡献来计算。
然后先计算出$F(a)$,然后要求的就是$[0,b+1)$内 $F$值小于等于 $F(a)$ 的数的个数。
按照常规的数位dp思路,先考虑不足总位数的,然后再从高位向低位枚举,考虑以前位的贡献,得出当前的范围,直接计算即可。
由于有多组询问,需要使用前缀和优化转移过程。
这里为了不开long long把询问区间转化为 $[0,b)$ (实际上是 $[1,b)$),因此需要计算 $b$ 对答案的贡献。
#include <cstdio>
int f[10][10][10010] , b[10];
void init()
{
int i , j , k , l;
f[0][0][0] = b[0] = 1;
for(i = 1 ; i < 10 ; i ++ )
{
b[i] = b[i - 1] * 10;
for(j = 0 ; j < 10 ; j ++ )
for(k = 0 ; k < 10 ; k ++ )
for(l = j << (i - 1) ; l <= 10000 ; l ++ )
f[i][j][l] += f[i - 1][k][l - (j << (i - 1))];
}
for(i = 1 ; i < 10 ; i ++ )
for(j = 0 ; j < 10 ; j ++ )
for(k = 1 ; k <= 10000 ; k ++ )
f[i][j][k] += f[i][j][k - 1];
}
int calc(int n)
{
int t = 1 , ans = 0;
while(n) ans += n % 10 * t , n /= 10 , t <<= 1;
return ans;
}
int query(int n , int m)
{
int i , j , p , di = 1 , ans = 1 + (calc(n) <= m);
for(i = 1 ; b[i] <= n ; i ++ )
for(j = 1 ; j < 10 ; j ++ )
ans += f[i][j][m];
for( ; i ; i -- )
{
p = n / b[i - 1] % 10;
for(j = di ; j < p ; j ++ ) ans += f[i][j][m];
m -= p << (i - 1) , di = 0;
if(m < 0) break;
}
return ans;
}
int main()
{
init();
int T , i , a , b;
scanf("%d" , &T);
for(i = 1 ; i <= T ; i ++ ) scanf("%d%d" , &a , &b) , printf("Case #%d: %d\n" , i , query(b , calc(a)));
return 0;
}
【hdu4734】F(x) 数位dp的更多相关文章
- [hdu4734]F(x)数位dp
题意:求0~f(b)中,有几个小于等于 f(a)的. 解题关键:数位dp #include<bits/stdc++.h> using namespace std; typedef long ...
- hdu4734 F(x)(数位dp)
题目传送门 F(x) Time Limit: 1000/500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU-4734 F(x) 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 注意到F(x)的值比较小,所以可以先预处理所有F(x)的组合个数.f[i][j]表示 i 位数时 ...
- hdu 4389 X mod f(x) 数位DP
思路: 每次枚举数字和也就是取模的f(x),这样方便计算. 其他就是基本的数位Dp了. 代码如下: #include<iostream> #include<stdio.h> # ...
- HDU 4734 F(x) ★(数位DP)
题意 一个整数 (AnAn-1An-2 ... A2A1), 定义 F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1,求[0..B]内有多少 ...
- F(x) 数位dp
Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight ...
- HDU4389:X mod f(x)(数位DP)
Problem Description Here is a function f(x): int f ( int x ) { if ( x == 0 ) return 0; return f ( x ...
- HDU 4734 - F(x) - [数位DP][memset优化]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 Time Limit: 1000/500 MS (Java/Others) Memory Lim ...
- bzoj 3131 [Sdoi2013]淘金(数位DP+优先队列)
Description 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共N*N块. 一阵风吹 ...
随机推荐
- 20145202马超《java》【课堂实验】P98测试
当时在加水印所以没来得及提交,然而我回宿舍第一时间就提交了,希望老师额能够看到
- 利尔达仿真器加有人CC3200模块USR-C322上电测试
1. 使用利尔达的CC3200底板仿真器对有人CC3200模块USR-C322进行烧写,测试. 2. 连接的接口,需要连接6根线,如下,供电测试,第一波测试,输入+++回复a,然后在输入a,返回+OK ...
- Qml-Dialog不能隐藏标题栏和按钮自定义
在项目中,需要弹出一个对话框来完成用户输入的功能,为了考虑界面的同一,这里需要将原生自带的标题栏隐藏掉,换成自己写的 按照widget的写法,可以使用QDialog,但是qml与之对应的Dialog我 ...
- katalon系列七:Katalon Studio全局变量
假如你有3个脚本都用到了用户名,如果是写死在脚本中,那么需要改变的时候,你需要修改3个地方,我们可以把用户名设为全局变量,在3个脚本中引用,需要修改时只要修改全局变量中的用户名值即可. 在Katalo ...
- CentOS 7.2 安装zabbix 3.4
一.zabbix版本选择及部署环境说明 1.zabbix版本选择 zabbix官网地址:www.zabbix.com zabbix每半年发布一个长期支持版,目前长期支持版有2.0.3.0等,所以选择z ...
- Java开发工程师(Web方向) - 03.数据库开发 - 第4章.事务
第4章--事务 事务原理与开发 事务Transaction: 什么是事务? 事务是并发控制的基本单位,指作为单个逻辑工作单元执行的一系列操作,且逻辑工作单元需满足ACID特性. i.e. 银行转账:开 ...
- 浅谈如何写出一个让(坑)人(王)很(之)难(王)发现的bug
该文章内容来自脚本之家,原文链接:https://www.jb51.net/news/598404.html 程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因 ...
- python程序设计——函数设计与调用
一.函数定义与调用 def 函数名([参数列表]): '''注释''' 函数体 # 输出小于n的斐波那契数 >>def fib(n): a,b=1,1 while a < n: pr ...
- 剑指offer-整数中1出现的次数27
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- poj 2155 (二维树状数组 区间修改 求某点值)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 33682 Accepted: 12194 Descript ...