bzoj 1970: [Ahoi2005]Code 矿藏编码

来源:互联网 发布:矩阵分析课后答案pdf 编辑:程序博客网 时间:2024/06/16 01:56

题意:自己看
题解:高精度直接搞
代码:

#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();}
原创粉丝点击