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 ...
随机推荐
- python 实现爬取网站下所有URL
python3 实现爬取网站下所有URL 获取首页元素信息: 首页的URL链接获取: 遍历第一次返回的结果: 递归循环遍历: 全部代码如下: 小结: python3.6 requests && ...
- spring实战学习笔记(一)spring装配bean
最近在学习spring boot 发现对某些注解不是很深入的了解.看技术书给出的实例 会很疑惑为什么要用这个注解? 这个注解的作用?有其他相同作用的注解吗?这个注解的运行机制是什么?等等 spring ...
- 进军pc市场 华为剑走偏锋可有戏?
尽管官方并未正式公布,但在前段时间,华为将要进军PC市场的消息在业内传得沸沸扬扬,据知情人士曝料,其第一款个人电脑将在今年4月上线.而华为将进军PC市场的消息,对其他智能手机厂商来说又意味着什么呢? ...
- Codeforces 468C Hack it!
https://www.luogu.org/problemnew/show/CF468C http://codeforces.com/contest/468/problem/C #include &l ...
- Cobbler 自动安装CentOS7
1. Cobbler介绍 Cobbler是一个Linux服务器安装的服务,可以通过网络启动(PXE)的方式来快速安装.重装物理服务器和虚拟机,同时还可以管理DHCP,DNS等.Cobbler可以使用命 ...
- java并发编程(十七)----(线程池)java线程池架构和原理
前面我们简单介绍了线程池的使用,但是对于其如何运行我们还不清楚,Executors为我们提供了简单的线程工厂类,但是我们知道ThreadPoolExecutor是线程池的具体实现类.我们先从他开始分析 ...
- 剑指offer-链表
1. 链表中环的入口节点 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 思路一:用哈希表存已经遍历过的节点,O(1)复杂度查找,如果再次遇到就是环入口 # -*- cod ...
- todaytt
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.Drawe ...
- bootstrap实战练习中涉及的知识点(很有用哦!)
看的有关视频做的笔记,对bootstrap中涉及的知识点做了一定的解析,很有用哦!(新手上路,有不合适的地方可以指出哦!) 下面进入正题: Bootstrap是当下最流行的前端框架(界面工具集) 特点 ...
- java并发系列 - 第29天:高并发中常见的限流方式
这是java高并发系列第29篇. 环境:jdk1.8. 本文内容 介绍常见的限流算法 通过控制最大并发数来进行限流 通过漏桶算法来进行限流 通过令牌桶算法来进行限流 限流工具类RateLimiter ...