AHOI2005 矿藏编码

题目链接

题解

标准的递归定义。按照递归定义处理即可。
答案很大,要用int128或者double

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
#include <bits/stdc++.h>
#define INF 2000000000
using namespace std;
typedef __int128 ll;
int n;
ll ans = 0;
void init(){
scanf("%d", &n);
}
void get(ll d){
int p;
scanf("%1d", &p);
if(p == 0) ans += d * d;
else if(p == 2){
for(int i = 0; i < 4; ++i) get(d >> 1);
}
}
void solve(){
ll a = 1;
for(int i = 1; i <= n; ++i) a *= 2ll;
get(a);
int num[50], len = 0;
while(ans)
num[++len] = ans % 10, ans /= 10;
for(int i = len; i >= 1; --i) printf("%d", num[i]);
}
int main(){
init();
solve();
return 0;
}