【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块. 一阵风吹 ...
随机推荐
- NoSQL入门第五天——Java连接与整合操作
一.测试联通 1.新建个web工程 2.导入jar:当然实际使用的时候肯定是通过maven来构建(如果有机会,可以尝试学习gradle进行构建) 3.建个测试类:好久没开eclipse了,希望后面可以 ...
- dfs 队列
题目来源 poj 1562 Description The GeoSurvComp geologic survey company is responsible for detecting unde ...
- 成都Uber优步司机奖励政策(4月7日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- mysql主从集群搭建;(集群复制数据)
1.搭建mysql 5.7环境chown mysql:mysql -R /data/groupadd mysqluseradd -g mysql mysql yum install numactlrp ...
- Hive窗口函数之LAG、LEAD、FIRST_VALUE、LAST_VALUE的用法
一.创建表: create table windows_ss ( polno string, eff_date string, userno string ) ROW FORMAT DELIMITED ...
- 二、StreamAPI
一.Stream是什么? 是数据通道,用于操作数据源(集合.数组等)所生成的元素序列.集合讲的是数据,流讲的是计算. 注意: Stream不会存储元素. Stream不会改变源对象.相反,他们会返回一 ...
- JDBC 工具类模板c3p0
JDBC 工具类模板 package com.itheima.sh.utils; import com.mchange.v2.c3p0.ComboPooledDataSource; import ja ...
- python简单的socket 服务器和客户端
服务器端代码 if "__main__" == __name__: try: sock = socket.socket(socket.AF_INET, socket.SOCK_ST ...
- 一个只有十行的精简MVVM框架(上篇)
本文来自网易云社区. 前言 MVVM模式相信做前端的人都不陌生,去网上搜MVVM,会出现一大堆关于MVVM模式的博文,但是这些博文大多都只是用图片和文字来进行抽象的概念讲解,对于刚接触MVVM模式的新 ...
- 利用JSON Schema校验JSON数据格式
最近笔者在工作中需要监控一批http接口,并对返回的JSON数据进行校验.正好之前在某前端大神的分享中得知这个神器的存在,调研一番之后应用在该项目中,并取得了不错的效果,特地在此分享给各位读者. 什么 ...