bzoj 1970: [Ahoi2005]Code 矿藏编码
.
题意:自己看
题解:高精度直接搞
代码:
#include<bits/stdc++.h>
using namespace std;
int k,now=0,len;
const int base=10000;
struct num
{
int len,a[10];
num(int x=0)
{
len=0;
memset(a,0,sizeof(a));
while(x)
{
a[len++]=x%base;
x/=base;
}
}
int& operator[](int x)
{
return a[x];
}
void print()
{
if(len==0)
printf("0");
else
{
printf("%d",a[len-1]);
for(int i=len-2;i>=0;i--)
printf("%04d",a[i]);
}
}
}ans;
char s[210];
num operator+(num x,num y)
{
if(x.len<y.len)
swap(x,y);
num ans=x;
for(int i=0;i<ans.len;i++)
{
ans[i]+=y[i];
ans[i+1]+=ans[i]/base;
ans[i]%=base;
}
if(ans[ans.len])
ans.len++;
return ans;
}
num operator*(num x,int y)
{
num ans;
ans.len=x.len;
for(int i=0;i<ans.len;i++)
{
ans[i]+=x[i]*y;
ans[i+1]+=ans[i]/base;
ans[i]%=base;
}
while(ans[ans.len])
{
ans[ans.len+1]+=ans[ans.len]/base;
ans[ans.len]%=base;
ans.len++;
}
return ans;
}
num pow(int x,int y)
{
num ans(1);
for(int i=0;i<y;i++)
ans=ans*x;
return ans;
}
void wk(int x)
{
// printf("*%d\n",now);
if(s[now]=='2')
{
for(int i=0;i<4;i++)
{
now++;
wk(x-1);
}
}
else if(s[now]=='0')
{
ans=ans+pow(4,x);
// printf("%d ",x);
// ans.print();
// puts("");
}
}
int main()
{
scanf("%d%s",&k,s);
len=strlen(s);
wk(k);
ans.print();
}