SPOJ BALNUM Balanced Numbers (数位dp)
题目:http://www.spoj.com/problems/BALNUM/en/
题意:找出区间[A, B]内所有奇数字出现次数为偶数,偶数字出现次数为计数的数的个数。
分析:
明显的数位dp题,首先,只有3种状态(0:没出现过, 1:数字出现奇数次, 2:数字出现偶数次),所以, 0~9 出现的次数就可以用3进制表示,最大的数就是 310 ,那么我们就可以把1019 哈希到310 内了。其中,我们可以假设:
(0:30 ,1:31 , 2:32 , .... , 9: 39 )
当第一次出现是,就把次数 +1, 否则,奇数变偶数(1-->2),偶数变奇数(2-->1)。因此,每个数字的变化在0~2内,3进制不会有冲突产生。
设记忆化数组f[20][310], 就是f[i][s] 表示取了前 i 位数字哈希后值为 s 的方法数。
代码:
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std;
typedef unsigned long long ull;
const int N = ; ull f[N][];
int dg[N]; int check(int s) {
int nu[];
for(int i = ; i < ; ++i) {
int k = s % ;
s /= ;
if(!k) continue;
if((i&) && (k==)) return ;
if(!(i&) && (k==)) return ;
}
return ;
} int new_s(int d, int s) {
int nu[];
for(int i = ; i < ; ++i, s /= ) nu[i] = s % ; if(nu[d] == ) nu[d] = ;
else nu[d] = - nu[d];
for(int i = ; i > -; --i) s = s * + nu[i];
return s;
} ull dfs(int i, int s, bool flag, bool e) {
if(i == -) return check(s);
if(!e && ~f[i][s]) return f[i][s];
int res = ;
int u = e ? dg[i] : ;
for(int d = ; d <= u; ++d) {
res += dfs(i-, (flag==&&d==) ? : new_s(d, s), flag||d>, e&&d==u);
}
return e ? res : f[i][s] = res;
} ull solve(ull x) {
int len = ;
for( ; x; x /= ) dg[len++] = x % ;
return dfs(len-, , , );
} int main()
{
int T;
scanf("%d", &T);
ull a, b;
memset(f, -, sizeof f);
while(T--) {
scanf("%llu %llu", &a, &b);
printf("%llu\n", solve(b)-solve(a-));
}
return ;
}
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+三进制状压)
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 ...
- 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],问有多少个平衡数? ...
随机推荐
- How to submit a package to PyPI
How to submit a package to PyPI The other month a coworker of mine wanted to distribute a small wrap ...
- 通过exp命令对Oracle数据库进行备份操作(提供两种情况的备份:备份本地,备份远程的数据库)
exp 用户名/密码@数据库所在ip地址:数据库端口号/数据库的service-name file=存储到的位置 这个是能成功的 http://www.2cto.com/database/201402 ...
- 为什么你学过Java却忘光了——记第一次助教同学见面会
大约两周之前,主讲老师刘志勇老师和我约定,让我上周四到课堂上和同学们认识.交流一下.一开始我不太明了去和大家见面要说些什么,也不太理解这么做的必要性是什么.但随着日子临近,我请教了周筠老师,周筠老师和 ...
- No.1000_第五次团队会议
光辉的一夜 今夜注定是不平凡的一夜.是崔强同学伟大的一夜. 昨天因为实验室项目,我刚上完编译课就被学院叫走去做项目,当时我就很无奈,因为说好了要和崔强一起实现下午的前端,他写界面我写底层逻辑,这样我们 ...
- Servet3.0于Servlet2.5比较
Servet3.0于Servlet2.5比较恢复 首先是利用注解代替配置文件 Servlet2.5利用配置文件对Servlet进行配置 例如这样 <servlet> <servlet ...
- Hibernate 与 mybatis 区别
JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结 我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践 ...
- gdb调试器学习链接
首先要带 -g 选项用gcc编译 常用指令:http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html#gdb 带main的命令行参 ...
- python learning2.py
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] # 取前3个元素的笨方法 r = [] n = 3 for i in range(n): r.appe ...
- iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件上传
官方建议AFN的使用方法 0.导入框架准备工作 •1. 将AFNetworking3.0+框架程序拖拽进项目 •2. 或使用Cocopod 导入AFNetworking3.0+ •3. 引入 ...
- ResourceBundle类读取properties文件
1.Properties与ResourceBundle类都可以读取属性文件key/value的键值对 2.ResourceBundle类主要用来解决国际化和本地化问题,国际化时properties文件 ...