代码+注释

  1 //我感觉这道题最扯的就是我因为输入而TLE了半天,懵逼死了,想破脑袋也没想到因为输入TLE了半天
2 //题意:求区间内数字满足“奇数各数出现偶数次,偶数各数出现奇数次”的数字的个数。
3 //题解:
4 //dp[x][y]表示长度为x的时候0~9各出现的状态情况,因为可能有未出现的情况,如果这个y用二进制
5 //保存的话那么未出现的偶数可能会因为0而出现误判,所以应该多一个状态,就用三进制。0表示未出现,
6 //1表示出现了奇数次,2表示出现了偶数次。
7 //就是一道状压+数位dp,和XHXJ's LIS HDU - 4352 很相似
8 //XHXJ's LIS HDU - 4352(这个是状压成二进制+dp):https://www.cnblogs.com/kongbursi-2292702937/p/11934243.html
9
10 #include<stdio.h>
11 #include<string.h>
12 #include<algorithm>
13 #include<iostream>
14 using namespace std;
15 const int maxn=20;
16 const int N=1<<10;
17 typedef long long ll;
18 ll v[maxn],dp[maxn][60000],w[15];
19 //ll mul(ll x, ll y) {
20 // ll ret = 1;
21 // while(y) {
22 // if(y & 1) ret *= x;
23 // x *= x;
24 // y >>= 1;
25 // }
26 // return ret;
27 //}
28 //ll update(ll i,ll s) {
29 // ll ts = s, ti = i;
30 // while(ti--) ts /= 3;
31 // ll bit = ts % 3;
32 // if(bit < 2) return s + mul(3, i);
33 // return s - mul(3, i);
34 //}
35 ll update(ll x,ll y) //更新我们压缩的状态
36 {
37 ll ans[maxn],len=0;
38 memset(ans,0,sizeof(ans));
39 while(y)
40 {
41 ans[len]=y%3;
42 len++;
43 y/=3;
44 }
45 if(ans[x]==0)
46 {
47 ans[x]=1;
48 }
49 else if(ans[x]==1)
50 ans[x]=2;
51 else ans[x]=1;
52 len=max(x+1,len);
53
54 y=0;
55 x=1;
56 for(ll i=0; i<len; ++i)
57 {
58 y+=ans[i]*x;
59 x*=3;
60 }
61 return y;
62 }
63 bool get_num(ll x)
64 {
65 ll ans[maxn],len=0;
66 memset(ans,0,sizeof(ans));
67 while(x)
68 {
69 ans[len]=x%3;
70 len++;
71 x/=3;
72 }
73 bool flag=0;
74 for(ll i=0; i<len; ++i)
75 {
76 if(i==0 || i%2==0)
77 {
78 if(ans[i]!=0 && ans[i]!=1)
79 {
80 flag=1;
81 break;
82 }
83
84 }
85 else
86 {
87 if(ans[i]!=0 && ans[i]!=2)
88 {
89 flag=1;
90 break;
91 }
92
93 }
94 }
95 return flag;
96 }
97 ll dfs(ll pos,ll sta,bool limit,bool lead)
98 {
99 if(pos==-1)
100 {
101 if(!get_num(sta))
102 return 1;
103 else return 0;
104 }
105 if(!limit && dp[pos][sta]!=-1) return dp[pos][sta];
106 ll up=limit?v[pos]:9;
107 ll tmp=0;
108 for(ll i=0; i<=up; ++i)
109 {
110 if(lead && i==0)
111 {
112 tmp+=dfs(pos-1,0,limit && i==v[pos],1);
113
114 }
115 else
116 {
117
118 tmp+=dfs(pos-1,update(i,sta),limit && i==v[pos],0);
119
120 }
121 }
122 if(!limit) dp[pos][sta]=tmp;
123 return tmp;
124 }
125 ll solve(ll ans)
126 {
127 ll pos=0;
128 while(ans)
129 {
130 v[pos++]=ans%10;
131 ans/=10;
132 }
133 return dfs(pos-1,0,true,1);
134 }
135 int main()
136 {
137 int t;
138 ll l,r;
139 cin>>t;
140 memset(dp,-1,sizeof(dp));
141 while(t--)
142 {
143 cin >> l >> r;
144 cout << solve(r) - solve(l-1) << endl;
145 }
146 return 0;
147 }

Balanced Numbers SPOJ - BALNUM的更多相关文章

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

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

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

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

  3. SPOJ - BALNUM - Balanced Numbers(数位DP)

    链接: https://vjudge.net/problem/SPOJ-BALNUM 题意: Balanced numbers have been used by mathematicians for ...

  4. BALNUM - Balanced Numbers

    BALNUM - Balanced Numbers Time limit:123 ms Memory limit:1572864 kB Balanced numbers have been used ...

  5. spoj Balanced Numbers(数位dp)

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

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

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

  7. Balanced Numbers (数位dp+三进制)

    SPOJ - BALNUM 题意: Balanced Numbers:数位上的偶数出现奇数次,数位上的奇数出现偶数次(比如2334, 2出现1次,4出现1次,3出现两次,所以2334是 Balance ...

  8. Balanced Numbers (数位DP)

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

  9. Balanced Numbers(数位dp)

    Description Balanced numbers have been used by mathematicians for centuries. A positive integer is c ...

随机推荐

  1. 【Software Test】Introduction to Software Testing

    Introduction to Software Testing 文章目录 Going to Learn --. Evolution of The Software Industry Errors, ...

  2. show engine innodb status

    TRANSACTIONS------------Trx id counter 2003909(当前事务号)Purge done for trx's n:o < 2003905 (清理线程完成到了 ...

  3. centos7安装宝塔面板

    在终端下执行如下命令 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.s ...

  4. Pulsar vs Kafka,CTO 如何抉择?

    本文作者为 jesse-anderson.内容由 StreamNative 翻译并整理. 以三个实际使用场景为例,从 CTO 的视角出发,在技术等方面对比 Kafka 和 Pulsar. 阅读本文需要 ...

  5. 忒修斯的Mac

    我有一台Mac笔记本,用了快6年了,当初买它的时候还借了几千块. 三年前,它的屏幕坏了,修理的方式就是直接换屏,而换屏其实就是上半部分连壳带屏幕整个换掉,简单的说:另一台电脑的上半身嫁接过来. 今年, ...

  6. 为什么Go自带的日志默认输出到os.Stderr?

    为什么Go自带的日志默认输出到os.Stderr? - 知乎 https://www.zhihu.com/question/67629357 Note that the Go runtime writ ...

  7. 【LinuxShell】echo用法详解

    使用echo打印信息到终端 1 [Shell]echo "yz test" 2 yz test 3 [Shell]echo yz test 4 yz test 5 [Shell]e ...

  8. .net core Wpf中使用cefsharp加载本地html网页,并且cefsharp支持any cpu

    第一步,在程序包管理器安装 cefsharp.wpf 第二步 您必须在项目的第一个 < propertygroup > 中添加 < cefsharpanycpusupport > ...

  9. 【ElasticSearch】 使用AWS云ES服务来分析程序日志

    最近公司系统升级,有些API的调用接口达到了每天10几万的请求量.目前公司里的日志,都是写文本文件中的.为了能够更好的分析这些日志数据,公司采用了AWS 的 ElasticSearch服务来分析日志. ...

  10. HarmonyOS三方件开发指南(7)——compress组件

    目录:1. 组件compress功能介绍2. 组件compress使用方法3. 组件compress开发实现 1. 组件compress功能介绍1.1.  组件介绍:        compress是 ...