[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. Mysql数据库设置定时任务

    最近手头在做一个拍卖的电商项目. 中间需要将到点的拍卖会状态设置为进行中. 我们的解决方案是Mysql的定时器任务,这里进行一个简单的总结. 1.使用范围 不是所有的MySQL版本都支持,Mysql ...

  2. MySQL安装图解

    MySQL安装图解 打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩,运行“setup.exe”,出现如下界面:           mysql安装向导启动,按“N ...

  3. CentOS6.5 安装Sphinx 配置MySQL数据源

      前提安装完mysql,并创建测试表和数据 DROP TABLE IF EXISTS `documents`; CREATE TABLE IF NOT EXISTS `documents` ( `i ...

  4. Photoshop 融合属性 Unity Shader

    http://forum.unity3d.com/threads/free-photoshop-blends.121661/

  5. 安装glue,用glue批量处理图片的步骤

     glue批量处理图片:http://glue.readthedocs.io/en/latest/quickstart.html#and-why-those-css-class-names 首先需要安 ...

  6. Android签名总结

    signapk.jar与eclipse export插件默认赋予程序一个DEBUG权限的签名 signapk.jar包含有系统权限(system api, permission),而eclipse e ...

  7. Python操作Redis、Memcache、RabbitMQ、SQLAlchemy

    Python操作 Redis.Memcache.RabbitMQ.SQLAlchemy redis介绍:redis是一个开源的,先进的KEY-VALUE存储,它通常被称为数据结构服务器,因为键可以包含 ...

  8. layoutSubviews方法需要被调用的情况有哪些

    layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写 layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubviews 但是是用i ...

  9. VS Code 开发asp.net core 遇到的坑

    摘要 微软发布.NET Core 1.0,ASP.NET Core 1.0 与 Entity Framewok 1.0也有一段时间了,一直没进行这方面的学习,节前公司让调研这方面的可行性.所以还是从最 ...

  10. javascript 之Object内置对象

    Object.defineProperty(obj, prop, descriptor)