BALNUM - Balanced Numbers(数位dp)
题目链接:http://www.spoj.com/problems/BALNUM/en/
题意:问你在[A,B]的闭区间内有几个满足要求的数,要求为每个出现的奇数个数为偶数个,每个出现的偶数个数为奇数个。
显然dfs很好想到dfs(int len , int even[] , int odd[] , int flag , int first)
even表示前len位出现偶数的总状态 , odd表示前len位出现奇数的总状态,first表示是否为首位(特判全为0的结果)
但是这样写dfs dp不好搞,因为dp也要能表示前len位的奇偶出现状况,所以索性直接将dp的第二维保存为状态。
由于一共有0~9,10个数字,而且总共只有奇偶两种状态,所以直接用3进制来保存状态。
即dp[len][s],dfs(int len , int s , int flag , int first)
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef unsigned long long ull;
const int M = 6e4;
ull a , b , dp[20][M];
int dig[20];
int check(int x) {
int num[20];
for(int i = 0 ; i < 10 ; i++) {
num[i] = x % 3;
x /= 3;
}
for(int i = 0 ; i < 10 ; i++) {
if(num[i]) {
if(i % 2 == 0) {
if(num[i] == 2)
return 0;
}
else {
if(num[i] == 1)
return 0;
}
}
}
return 1;
}
int getsnew(int s , int x) {
int num[20];
for(int i = 0 ; i < 10 ; i++) {
num[i] = s % 3;
s /= 3;
}
if(num[x] != 0)
num[x] = 3 - num[x];
else
num[x] = 1;
int sum = 0;
int power = 1;
for(int i = 0 ; i < 10 ; i++) {
sum += num[i] * power;
power *= 3;
}
return sum;
}
ull dfs(int len , int s , int flag , int first) {
if(!len)
return check(s);
if(!flag && dp[len][s] != -1)
return dp[len][s];
int t = flag ? dig[len] : 9;
ull sum = 0;
for(int i = 0 ; i <= t ; i++) {
if(first) {
sum += dfs(len - 1 , i == 0 ? 0 : getsnew(s , i) , flag && i == t , first && i == 0);
}
else {
sum += dfs(len - 1 , getsnew(s , i) , flag && i == t , first && i == 0);
}
}
if(!flag)
dp[len][s] = sum;
return sum;
}
ull Gets(ull x) {
if(x == 0)
return 1;
int len = 0;
while(x) {
dig[++len] = x % 10;
x /= 10;
}
return dfs(len , 0 , 1 , 1);
}
int main() {
int t;
memset(dp , -1 , sizeof(dp));
scanf("%d" , &t);
while(t--) {
scanf("%lld%lld" , &a , &b);
printf("%lld\n" , Gets(b) - Gets(a - 1));
}
return 0;
}
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 ...
- Balanced Numbers (数位DP)
Balanced Numbers https://vjudge.net/contest/287810#problem/K Balanced numbers have been used by math ...
- spoj Balanced Numbers(数位dp)
一个数字是Balanced Numbers,当且仅当组成这个数字的数,奇数出现偶数次,偶数出现奇数次 一下子就相到了三进制状压,数组开小了,一直wa,都不报re, 使用记忆化搜索,dp[i][s] 表 ...
- spoj 10606 Balanced Numbers 数位dp
题目链接 一个数称为平衡数, 满足他各个数位里面的数, 奇数出现偶数次, 偶数出现奇数次, 求一个范围内的平衡数个数. 用三进制压缩, 一个数没有出现用0表示, 出现奇数次用1表示, 出现偶数次用2表 ...
- BALNUM - Balanced Numbers
BALNUM - Balanced Numbers Time limit:123 ms Memory limit:1572864 kB Balanced numbers have been used ...
- 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP)
2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP) 链接:https://ac.nowcoder.com/acm/contest/163/ ...
- 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 - BALNUM - Balanced Numbers(数位DP)
链接: https://vjudge.net/problem/SPOJ-BALNUM 题意: Balanced numbers have been used by mathematicians for ...
随机推荐
- 解释一下一门语言该有的东东(Javascript)
注释 Js中有两种注释 // 单行注释 /**/ 多行注释 变量 变量就像学校学习的 未知数 如 3 + x = 8 x: 类似变量,在改造一下 x + y = z 当 x=3, y=5, z=8, ...
- MongoDB之数据库备份与恢复
MongoDB之数据备份与恢复 一,需求 一段时间备份数据库数据,以防意外导致数据丢失 二,备份与恢复 2.1,数据库备份 1,常用命令格式 mongodump -h IP --port 端口 -u ...
- Spring Cloud下基于OAUTH2+ZUUL认证授权的实现
Spring Cloud下基于OAUTH2认证授权的实现 在Spring Cloud需要使用OAUTH2来实现多个微服务的统一认证授权,通过向OAUTH服务发送某个类型的grant type进行集中认 ...
- 控制台基于Quartz.Net组件实现定时任务调度(一)
前言: 你曾经需要应用执行一个任务吗?比如现在有一个需求,需要每天在零点定时执行一些操作,那应该怎样操作呢? 这个时候,如果你和你的团队是用.NET编程的话,可以考虑使用Quartz.NET调度器.允 ...
- idea中的springboot项目如何不用重新编译,自动热部署
两步走:引入依赖,配置idea 在pom.xml中引入如下依赖,关键字:devtools 第二步,修改idea两处配置 2.1 windows下,ctl+alt+s打开idea配置菜单 左上角输入框搜 ...
- android ——悬浮按钮及可交互提示
一.悬浮按钮 FloatingActionButton是Design Support中的一个控件,它会默认colorAccent作为按钮的颜色,还可以给按钮一个图标. 这是没有图标的,这是有图标的. ...
- 初识JavaScript和面向对象
1.javascript基本数据类型: number: 数值类型 string: 字符串类型 boolean: 布尔类型 null: 空类型 undefault:未定义类型 object: 基本数据类 ...
- Oracle、MySQL和Sqlserver的事务管理、分页和别名的区别
1.在mysql中事务默认是自动提交的,只有设置autocommit为0的时候,才用自己commit(commit--rollback回滚) 2.但是在oracle中必须自己commit;不然就只能结 ...
- while 的循环遍历 分享心得
while 基本循环体 1.while while 条件: 循环体 2.while else while 条件: 循环体 else:#如果while条件结果为假 不执行循环体 直接执行else 代码块 ...
- jenkins增量更新及重启服务步骤
jenkins增量更新步骤:(以creditsys_service_tomcat为例) 1.SecureCRT 或者Xshell 连接服务器192.168.*.*,账号:test/**** 2.cd ...