SPOJ - BALNUM - Balanced Numbers(数位DP)
链接:
https://vjudge.net/problem/SPOJ-BALNUM
题意:
Balanced numbers have been used by mathematicians for centuries. A positive integer is considered a balanced number if:
Every even digit appears an odd number of times in its decimal representation
Every odd digit appears an even number of times in its decimal representation
For example, 77, 211, 6222 and 112334445555677 are balanced numbers while 351, 21, and 662 are not.
Given an interval [A, B], your task is to find the amount of balanced numbers in [A, B] where both A and B are included.
思路:
三进制记录每个值用的奇数次还是偶数次。
直接DP即可。
代码:
// #include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<string.h>
#include<set>
#include<queue>
#include<algorithm>
#include<math.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int MOD = 1e9+7;
const int MAXN = 1e6+10;
ULL a, b;
ULL F[21][60000];
int dig[21];
ULL m[11];
int Upd(int x, int p)
{
int sum = 0;
for (int i = 0;i < 10;i++)
{
int tmp = x%3;
x /= 3;
if (i == p)
sum += (tmp == 1 ? 2 : 1) * m[i];
else
sum += tmp * m[i];
}
return sum;
}
bool Check(int x)
{
int p = 0;
while(x)
{
if (x%3 == 2 && p%2 == 0)
return false;
if (x%3 == 1 && p%2 == 1)
return false;
x /= 3;
p++;
}
return true;
}
ULL Dfs(int pos, int sta, bool zer, bool lim)
{
if (pos == -1)
return Check(sta);
if (!lim && F[pos][sta] != -1)
return F[pos][sta];
int up = lim ? dig[pos] : 9;
ULL ans = 0;
for (int i = 0;i <= up;i++)
{
ans += Dfs(pos-1, (zer && i == 0) ? 0 : Upd(sta, i), zer && i == 0, lim && i == up);
}
if (!lim)
F[pos][sta] = ans;
return ans;
}
ULL Solve(ULL x)
{
int p = 0;
while(x)
{
dig[p++] = x%10;
x /= 10;
}
return Dfs(p-1, 0, 1, 1);
}
int main()
{
// freopen("test.in", "r", stdin);
m[0] = 1;
for (int i = 1;i < 11;i++)
m[i] = m[i-1]*3;
memset(F, -1, sizeof(F));
int t;
scanf("%d", &t);
while(t--)
{
scanf("%llu %llu", &a, &b);
printf("%llu\n", Solve(b)-Solve(a-1));
}
return 0;
}
SPOJ - BALNUM - Balanced Numbers(数位DP)的更多相关文章
- SPOJ BALNUM - Balanced Numbers - [数位DP][状态压缩]
题目链接:http://www.spoj.com/problems/BALNUM/en/ Time limit: 0.123s Source limit: 50000B Memory limit: 1 ...
- SPOJ10606 BALNUM - Balanced Numbers(数位DP+状压)
Balanced numbers have been used by mathematicians for centuries. A positive integer is considered a ...
- spoj 10606 Balanced Numbers 数位dp
题目链接 一个数称为平衡数, 满足他各个数位里面的数, 奇数出现偶数次, 偶数出现奇数次, 求一个范围内的平衡数个数. 用三进制压缩, 一个数没有出现用0表示, 出现奇数次用1表示, 出现偶数次用2表 ...
- SPOJ BALNUM Balanced Numbers (数位dp)
题目:http://www.spoj.com/problems/BALNUM/en/ 题意:找出区间[A, B]内所有奇数字出现次数为偶数,偶数字出现次数为计数的数的个数. 分析: 明显的数位dp题, ...
- SPOJ - BALNUM Balanced Numbers(数位dp+三进制状压)
Balanced Numbers Balanced numbers have been used by mathematicians for centuries. A positive integer ...
- spoj Balanced Numbers(数位dp)
一个数字是Balanced Numbers,当且仅当组成这个数字的数,奇数出现偶数次,偶数出现奇数次 一下子就相到了三进制状压,数组开小了,一直wa,都不报re, 使用记忆化搜索,dp[i][s] 表 ...
- Balanced Numbers (数位DP)
Balanced Numbers https://vjudge.net/contest/287810#problem/K Balanced numbers have been used by math ...
- SPOJ BALNUM Balanced Numbers(数位DP+状态压缩)题解
思路: 把0~9的状态用3进制表示,数据量3^10 代码: #include<cstdio> #include<map> #include<set> #includ ...
- SPOJ BALNUM Balanced Numbers 平衡数(数位DP,状压)
题意: 平衡树定义为“一个整数的某个数位若是奇数,则该奇数必定出现偶数次:偶数位则必须出现奇数次”,比如 222,数位为偶数2,共出现3次,是奇数次,所以合法.给一个区间[L,R],问有多少个平衡数? ...
随机推荐
- path包 + pathfile 包 — 汇总
path包的使用 package main; import ( "fmt" "path" ) //go语言path包的学习 func main() { //返回 ...
- hdfs、tfs、fastdfs、Tachyon
hdfs 架构设计 HDFS按照Master和Slave的结构.分NameNode.SecondaryNameNode.DataNode这几个角色. NameNode:是Master节点,是管理者.. ...
- xorm-创建时间created
package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/ ...
- tkinter学习笔记_02
4. 多行输入框 text # 按钮 # command 执行动作 def insert_point(): var = e.get() t.insert('insert', var) b = tk.B ...
- core文件问题
core文件问题 Linux系统core涉及到的问题 core文件的问题具体可以参照系统的man手册(man core) 能否生成core文件 ulimit -c 磁盘权限问题 进程权限问题 生成co ...
- javascript 同源策略和 JSONP 的工作原理
同源策略 同源策略是一个约定,该约定阻止当前脚本获取或操作另一域的内容.同源是指:域名.协议.端口号都相同. 简单地说,A 服务器下的 a 端口执行 ajax 程序,不能获取 B 服务器或者 A 服务 ...
- (转)数据库函数解析JSON字符串
一.返回单行单列 二.返回表 三.SQL206版本开始支持 SELECT * FROM OPENJSON(@JsonStr)
- 封装的PKPM BimView的方法
封装的方法 var ObvApiWrapper; if (!ObvApiWrapper) { ObvApiWrapper = {}; } ObvApiWrapper = function(build, ...
- mybatis generator对于同一个表生成多次代码的问题
原文:https://blog.csdn.net/jiangjun0130/article/details/83055336 现象: mybatis generator是一个持久层代码自动生成工具,能 ...
- flex 布局学习
flex 布局学习 寻根溯源话布局 一切都始于这样一个问题:怎样通过 CSS 简单而优雅的实现水平.垂直同时居中.记得刚开始学习 CSS 的时候,看到 float 属性不由得感觉眼前一亮,顺理成章的联 ...