题解 BZOJ 1970 [Ahoi2005]Code 矿藏编码

写个高精度。
然后扫过去就行了。
抽题器竟然抽了这么水的题233.

code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int k;
struct N{
int a[100];
friend N operator + (const N&a,const N&b){
N c;
for(int i=0;i<100;i++) c.a[i]=a.a[i]+b.a[i];
for(int i=0;i<99;i++) c.a[i+1]+=c.a[i]/10,c.a[i]%=10;
return c;
}
N mul2(){
N b;
for(int i=0;i<100;i++) b.a[i]=a[i]*2;
for(int i=0;i<99;i++) b.a[i+1]+=b.a[i]/10,b.a[i]%=10;
return b;
}
void out(){
int top=99;
while(top>0&&a[top]==0){
top--;
}
while(top>=0) printf("%d",a[top--]);
puts("");
}
}po2[105],ans;
char s[205];
int p;
void solve(int k){
if(s[p]=='0') ans=ans+po2[2*k],p++;
else if(s[p]=='1'){
p++;
}else{
p++;
solve(k-1);
solve(k-1);
solve(k-1);
solve(k-1);
}
}
int main(){
po2[0].a[0]=1;
for(int i=1;i<=100;i++){
po2[i]=po2[i-1].mul2();
}
scanf("%d",&k);
scanf("%s",s+1);
p=1;
solve(k);
ans.out();
return 0;
}

评论小助手

评论正在加载...

Tip: 点击下方链接切换到 Disqus 评论框可以获得邮件提醒哦
🗣️ 加载 Disqus 评论框