SPOJ - BALNUM

题意:

Balanced Numbers:数位上的偶数出现奇数次,数位上的奇数出现偶数次(比如2334, 2出现1次,4出现1次,3出现两次,所以2334是 Balanced Numbers) ,求一个区间内有多少Balanced Numbers。

解题思路:看题很容易想到数位dp,但是怎么记录某数字出现的次数呢?由于某数字出现的次数只与奇偶有关,与大小没有关系,所以我们可以分别用0,1,2来表示某数字没有出现,出现奇数次,出现偶数次,然后就可以用三进制来记录所有数字出现的情况了。(比如10的三进制是101,即表示0,2出现奇数次,1没有出现)

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
typedef unsigned long long ll;
inline ll gcd(ll i,ll j){
return j==0?i:gcd(j,i%j);
}
inline ll lcm(ll i,ll j){
return i/gcd(i,j)*j;
}
ll dp[20][60000];
int dis[20],di[15];
int d[15],work;
int jug(int num){
int len=0;
memset(d,0,sizeof(d));
while(num){
d[len++]=num%3;
num/=3;
}
for(int i=0;i<10;i++){
if(d[i]==0)
continue;
if(i%2==0&&d[i]%2==0){
return 0;
}
else if(i%2==1&&d[i]%2==1){
return 0;
}
}
return 1;
}
int change(int num,int n){
int len=0;
memset(d,0,sizeof(d));
while(num){
d[len++]=num%3;
num/=3;
}
if(d[n]==1)
d[n]=2;
else
d[n]=1;
int ans=0;
for(int i=0;i<10;i++){
ans+=di[i]*d[i];
}
return ans;
}
ll dfs(int pos,int num,bool limit){
if(pos==-1){
work=1;
return jug(num);
}
if(!limit&&dp[pos][num]!=-1&&work)
return dp[pos][num];
int up=limit?dis[pos]:9;
ll ans=0;
for(int i=0;i<=up;i++){
if(work==1)
ans+=dfs(pos-1,change(num,i),limit&&i==up);
else
ans+=dfs(pos-1,0,limit&&i==up);
}
if(!limit)
dp[pos][num]=ans;
return ans;
}
ll solve(ll a){
int len=0;
ll ans=0;
work=0;
while(a!=0){
dis[len++]=a%10;
a/=10;
}
return dfs(len-1,0,true);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;
scanf("%d",&t);
memset(dp,-1,sizeof(dp));
di[0]=1;
for(int i=1;i<=10;i++){
di[i]=di[i-1]*3;
}
while(t--){
ll l,r;
scanf("%llu%llu",&l,&r);
printf("%llu\n",solve(r)-solve(l-1));
}
return 0;
}

  

Balanced Numbers (数位dp+三进制)的更多相关文章

  1. SPOJ - BALNUM Balanced Numbers(数位dp+三进制状压)

    Balanced Numbers Balanced numbers have been used by mathematicians for centuries. A positive integer ...

  2. Balanced Numbers (数位DP)

    Balanced Numbers https://vjudge.net/contest/287810#problem/K Balanced numbers have been used by math ...

  3. SPOJ BALNUM - Balanced Numbers - [数位DP][状态压缩]

    题目链接:http://www.spoj.com/problems/BALNUM/en/ Time limit: 0.123s Source limit: 50000B Memory limit: 1 ...

  4. spoj Balanced Numbers(数位dp)

    一个数字是Balanced Numbers,当且仅当组成这个数字的数,奇数出现偶数次,偶数出现奇数次 一下子就相到了三进制状压,数组开小了,一直wa,都不报re, 使用记忆化搜索,dp[i][s] 表 ...

  5. spoj 10606 Balanced Numbers 数位dp

    题目链接 一个数称为平衡数, 满足他各个数位里面的数, 奇数出现偶数次, 偶数出现奇数次, 求一个范围内的平衡数个数. 用三进制压缩, 一个数没有出现用0表示, 出现奇数次用1表示, 出现偶数次用2表 ...

  6. SPOJ10606 BALNUM - Balanced Numbers(数位DP+状压)

    Balanced numbers have been used by mathematicians for centuries. A positive integer is considered a ...

  7. Travelling(HDU3001+状压dp+三进制+最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题目: 题意:n个城市,m条边,每条边都有一个权值,问你经过所有的城市且每条边通过次数不超过两次 ...

  8. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP)

    2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP) 链接:https://ac.nowcoder.com/acm/contest/163/ ...

  9. HDU 3709 Balanced Number (数位DP)

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

随机推荐

  1. Go Example--组合函数

    package main import ( "fmt" "strings" ) func Index(vs []string, t string) int { ...

  2. 【SpringBoot】搜索框架ElasticSearch介绍和整合SpringBoot

    ========================12章 搜索框架ElasticSearch介绍和整合SpringBoot ============================= 加入小D课堂技术交 ...

  3. GoStudy——解决vscode中golang插件依赖安装失败问题

    vscode中安装ms-vscode.go插件后可以开启对go语言的支持,ms-vscode.go插件需要依赖一些工具,安装完成后提示 Installing github.com/nsf/gocode ...

  4. MySQL Error--Error Code

    mysql error code(备忘) 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导 ...

  5. uml类图符号

    符号及实例参照:http://www.blogjava.net/cnfree/archive/2012/10/30/390457.html https://blog.csdn.net/l_nan/ar ...

  6. ASP.NET资源大全-知识分享 【转载】

    API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台.官网 ASP.NET WebAPI:快捷创建 HTTP 服务 ...

  7. 基础:位(bit)、字节(byte)、字符、编码之间的关系

    1.位: 数据存储的最小单位.每个二进制数字0或者1就是1个位: 2.字节: 8个位构成一个字节:即:1 byte (字节)= 8 bit(位): 1 KB = 1024 B(字节): 1 MB = ...

  8. springboot中添加热部署

    <dependency> <!--Spring 官方提供的热部署插件 --> <groupId>org.springframework.boot</group ...

  9. gradle-4.1-all.zip离线包下载 极速 android studio2.3 3.0编译必备

    http://download.csdn.net/download/yongheng289/10039982 gradle-4.1-all.zip离线包下载 极速 android studio2.3 ...

  10. model.form使用,配合form的钩子

    一次model.form的使用记录,配合form钩子的过程 在写信息采集功能的时候,需要添加资产信息,使用modelform组件减少工作量 官网介绍:版本1.9.https://docs.django ...