[高精度 递归] BZOJ 2930 [Poi1999]梦游者 Sleepwalker

来源:互联网 发布:中国2015gdp数据 编辑:程序博客网 时间:2024/05/29 16:05

我还能说什么呢


#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>using namespace std;const int con=100000000;const int wei=8;class Int{  public:long long a[100];    void getdata(int x){memset(a,0,sizeof(a));while (x){a[++a[0]]=x%con;x=x/con;}}    void pri(bool flag){      if (a[0]==0||(a[0]==1&&a[1]==0)){printf("0");if (flag)printf("\n");return;}      printf("%lld",a[a[0]]);      for (int i=a[0]-1;i;i--)        printf("%08lld",a[i]);      if (flag)printf("\n");    }  bool operator <(const Int &X){      if (a[0]<X.a[0])return true;if (a[0]>X.a[0])return false;      for (int i=a[0];i;i--){if (a[i]<X.a[i])return true;if (a[i]>X.a[i])return false;}      return false;    }    bool operator >(const Int &X){      if (a[0]<X.a[0])return false;if (a[0]>X.a[0])return true;      for (int i=a[0];i;i--){if (a[i]<X.a[i])return false;if (a[i]>X.a[i])return true;}      return false;    }    bool operator <=(const Int &X){      if (a[0]<X.a[0])return true;if (a[0]>X.a[0])return false;      for (int i=a[0];i;i--){if (a[i]<X.a[i])return true;if (a[i]>X.a[i])return false;}      return true;    }    bool operator >=(const Int &X){      if (a[0]<X.a[0])return false;if (a[0]>X.a[0])return true;      for (int i=a[0];i;i--){if (a[i]<X.a[i])return false;if (a[i]>X.a[i])return true;}      return true;    }    bool operator ==(const Int &X){      if (a[0]!=X.a[0])return false;for (int i=a[0];i;i--)if (a[i]!=X.a[i])return false;      return true;    }    Int operator +(const Int &X){      Int c;memset(c.a,0,sizeof(c.a));      for (int i=1;i<=a[0]||i<=X.a[0];i++)        {c.a[i]=c.a[i]+a[i]+X.a[i];c.a[i+1]+=c.a[i]/con;c.a[i]%=con;}      c.a[0]=max(a[0],X.a[0]);if (c.a[c.a[0]+1])c.a[0]++;      return c;    }    Int operator +(int num){      Int c;memcpy(c.a,a,sizeof(c.a));c.a[1]+=num;      for (int i=1;i<=c.a[0]&&c.a[i]>=con;i++)c.a[i]-=con,c.a[i+1]++;      while (c.a[c.a[0]+1])c.a[0]++;      return c;    }    Int operator -(const Int &X){      Int c;memcpy(c.a,a,sizeof(c.a));      for (int i=1;i<=a[0];i++){c.a[i]=c.a[i]-X.a[i];if (c.a[i]<0){c.a[i+1]--;c.a[i]+=con;}}      while (c.a[0]&&!c.a[c.a[0]])c.a[0]--;      return c;    }    Int operator -(int num){      Int c;memcpy(c.a,a,sizeof(c.a));c.a[1]-=num;      for (int i=1;i<=c.a[0]&&c.a[i]<0;i++)c.a[i]+=con,c.a[i+1]--;      while (c.a[0]&&!c.a[c.a[0]])c.a[0]--;      return c;    }    Int operator *(const Int &X){      Int c;memset(c.a,0,sizeof(c.a));      for (int i=1;i<=a[0];i++)for (int j=1;j<=X.a[0];j++)                     {c.a[i+j-1]+=a[i]*X.a[j];c.a[i+j]+=c.a[i+j-1]/con;c.a[i+j-1]%=con;}      c.a[0]=max(a[0]+X.a[0]-1,0ll);if (c.a[a[0]+X.a[0]]>0)c.a[0]++;      return c;    }    Int operator *(int num){      Int c;memset(c.a,0,sizeof(c.a));      for (int i=1;i<=a[0];i++){c.a[i]+=a[i]*num;if (c.a[i]>=con){c.a[i+1]+=c.a[i]/con;c.a[i]%=con;}}      c.a[0]=a[0];if (c.a[c.a[0]+1]>0)c.a[0]++;      return c;    }    Int operator /(int num){      Int c;memset(c.a,0,sizeof(c.a));      long long x=0;for (int i=a[0];i;i--){x=x*con+a[i];c.a[i]=x/num;x=x%num;}      c.a[0]=a[0];if (c.a[0]&&!c.a[c.a[0]])c.a[0]--;      return c;    }};typedef long long D;const int dis[4][4]={  {0,0,0,0},  {0,1,8,9},  {0,2,7,6},  {0,3,4,5}};const int tag[4][4]={  {0,0,0,0},  {0,1,4,2},  {0,1,4,3},  {0,2,2,2}};int K;Int Ans;Int p[125];D ip[125];inline Int Solve(int k,D x,D y){  if (k==1){    Int ret; ret.getdata(dis[x][y]);    return ret;  }  D x0=x-1,y0=y-1,x1,y1;  for (int i=1;i<k;i++) x0/=3,y0/=3;  x1=x-x0*ip[k-1],y1=y-y0*ip[k-1];  x0++; y0++;  Int ret=p[2*k-2]*(dis[x0][y0]-1);  if (tag[x0][y0]==1)    return ret+Solve(k-1,y1,x1);  if (tag[x0][y0]==2)    return ret+Solve(k-1,x1,y1);  if (tag[x0][y0]==3)    return ret+Solve(k-1,ip[k-1]-x1+1,ip[k-1]-y1+1);  if (tag[x0][y0]==4)    return ret+Solve(k-1,ip[k-1]-y1+1,ip[k-1]-x1+1);}int main(){  D x1,y1,x2,y2;  freopen("t.in","r",stdin);  freopen("t.out","w",stdout);  scanf("%d",&K);  p[0].getdata(1); for (int i=1;i<=2*K;i++) p[i]=p[i-1]*3;  ip[0]=1; for (int i=1;i<=K;i++) ip[i]=ip[i-1]*3;  scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);  Ans=Solve(K,x2,y2)-Solve(K,x1,y1);  Ans.pri(1);  return 0;}


0 0
原创粉丝点击