[HDU3709]Balanced Number

试题描述

A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. More specifically, imagine each digit as a box with weight indicated by the digit. When a pivot is placed at some digit of the number, the distance from a digit to the pivot is the offset between it and the pivot. Then the torques of left part and right part can be calculated. It is balanced if they are the same. A balanced number must be balanced with the pivot at some of its digits. For example, 4139 is a balanced number with pivot fixed at 3. The torqueses are 4*2 + 1*1 = 9 and 9*1 = 9, for left part and right part, respectively. It's your job
to calculate the number of balanced numbers in a given range [x, y].

输入

The input contains multiple test cases. The first line is the total number of cases T (0 < T ≤ 30). For each case, there are two integers separated by a space in a line, x and y. (0 ≤ x ≤ y ≤ 1018).

输出

For each case, print the number of balanced numbers in the range [x, y] in a line.

输入示例


输出示例


数据规模及约定

见“输入”

题解

令 f[k][i][j][s] 表示考虑数的前 i 位,最高位为 j,支点在位置 k,支点右力矩 - 左力矩 = s 的数有多少个。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#define LL long long LL read() {
LL x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} #define maxn 20
#define maxs 1800
LL f[maxn][maxn][10][maxs]; int num[maxn];
LL sum(LL x) {
if(!x) return 1;
int cnt = 0; LL tx = x;
while(x) num[++cnt] = x % 10, x /= 10;
LL ans = 0;
for(int i = cnt - 1; i; i--)
for(int k = 1; k <= i; k++)
for(int j = 1; j <= 9; j++) ans += f[k][i][j][0];
for(int i = cnt; i; i--) {
for(int k = cnt; k; k--) {
int s = 0;
for(int x = cnt; x > i; x--) s += (x - k) * num[x];
if(s < 0 || s >= maxs) continue;
for(int j = i < cnt ? 0 : 1; j < num[i]; j++) {
ans += f[k][i][j][s];
// if(!j && !s && i > 1) ans--;
}
}
}
for(int k = 1; k <= cnt; k++) {
int s = 0;
for(int x = 1; x <= cnt; x++) s += (x - k) * num[x];
if(!s){ ans++; break; }
}
ans++;
return ans;
} int main() {
for(int j = 0; j <= 9; j++) f[1][1][j][0] = 1;
for(int k = 2; k < maxn; k++)
for(int j = 0; j <= 9; j++) f[k][1][j][(k-1)*j] = 1;
for(int k = 1; k < maxn; k++)
for(int i = 1; i < maxn - 1; i++)
for(int j = 0; j <= 9; j++)
for(int s = 0; s < maxs; s++) if(f[k][i][j][s]) {
for(int x = 0; x <= 9 && s + (k - i - 1) * x >= 0; x++)
if(s + (k - i - 1) * x < maxs) f[k][i+1][x][s+(k-i-1)*x] += f[k][i][j][s];
// printf("%d %d %d %d: %lld\n", k, i, j, s, f[k][i][j][s]);
}
int T = read();
while(T--) {
LL l = read(), r = read();
LL ans = sum(r); if(l) ans -= sum(l - 1);
printf("%lld\n", ans);
} return 0;
}

[HDU3709]Balanced Number的更多相关文章

  1. HDU3709 Balanced Number —— 数位DP

    题目链接:https://vjudge.net/problem/HDU-3709 Balanced Number Time Limit: 10000/5000 MS (Java/Others)     ...

  2. hdu3709 Balanced Number (数位dp+bfs)

    Balanced Number Problem Description A balanced number is a non-negative integer that can be balanced ...

  3. HDU3709 Balanced Number (数位dp)

     Balanced Number Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Descript ...

  4. [暑假集训--数位dp]hdu3709 Balanced Number

    A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. ...

  5. hdu3709 Balanced Number 树形dp

    A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. ...

  6. hdu3709 Balanced Number 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709 题目大意就是求给定区间内的平衡数的个数 要明白一点:对于一个给定的数,假设其位数为n,那么可以有 ...

  7. HDU3709 Balanced Number 题解 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709 题目大意: 求区间 \([x, y]\) 范围内"平衡数"的数量. 所谓平衡 ...

  8. HDU3709:Balanced Number(数位DP+记忆化DFS)

    Problem Description A balanced number is a non-negative integer that can be balanced if a pivot is p ...

  9. HDU - 3709 - Balanced Number(数位DP)

    链接: https://vjudge.net/problem/HDU-3709 题意: A balanced number is a non-negative integer that can be ...

随机推荐

  1. python和numpy的版本、安装位置

    命令行下查看python和numpy的版本和安装位置 1.查看python版本 方法一: python -V 注意:‘-V‘中‘V’为大写字母,只有一个‘-’ 方法二: python --versio ...

  2. lunix的查看Tomcat目录下日志的快速操作

    可以使用cd命令,cd命令的功能是切换到指定的目录: 命令格式:cd [目录名] 有几个符号作为目录名有特殊的含义: "/"代表根目录. ".."代表上一级目录 ...

  3. python学习笔记-(四)列表&元组

    1.列表及元组操作 1.1 列表 Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 定义列表: >>> namelist = ...

  4. sudo 出现unable to resolve host 解决方法

    inux 环境, 假设这台机器名字叫dev(机器的hostname), 每次执行sudo 就出现这个警告讯息:sudo: unable to resolve host dev虽然sudo 还是可以正常 ...

  5. CentOS7安装Nginx并部署

    服务器IP是192.168.36.136 1.直接yum install nginx即可 2.主配置文件是/etc/nginx/下的nginx.conf,另外一个是/etc/nginx/conf.d/ ...

  6. CSS 中背景图片定位方法

    三种: 关键字:background-position: top left; 像素:background-position: 0px 0px; 百分比:background-position: 0% ...

  7. Unable to find vcvarsall.bat的解决办法

    明年绝对买MAC电脑,这一两天安装paramiko,真是操碎了心. 安装paramiko时报error: Unable to find vcvarsall.bat这种错误,网上找了各种方法啊,解决的办 ...

  8. swiper 增加同页面增加2个滚动

    js代码 <script type="text/javascript"> var mySwiper = new Swiper('.slide_a',{ noSwipin ...

  9. Java WebService入门实例

    Web Services是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务. Web Service的关键技术和规则: 1.XML:描述 ...

  10. 多线程 GET

    iOS中多线程的实现 方案 简介 语言 线程生命周期 使用频率 pthread 一套通用的多线程API 适用于 Unix / Linux / Windows 等系统 跨平台\可移植 使用难度大 C 程 ...