[高精度 递归] 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
- [高精度 递归] BZOJ 2930 [Poi1999]梦游者 Sleepwalker
- bzoj 2656 数列sequence 递归+高精度
- BZOJ 2933([Poi1999]地图-区间Dp)
- 【博弈】【bzoj 2927】: [Poi1999]多边形之战
- BZOJ 2926 Poi1999 空立方体问题
- BZOJ 2927 POI1999 多边形之战 博弈论
- BZOJ 2929:[Poi1999]洞穴攀行
- [几何 分治] BZOJ 2928 [Poi1999]飞弹 Rockets
- [FloodFill] BZOJ 2936 [Poi1999]降 水 Water
- BZOJ 2927: [Poi1999]多边形之战
- bzoj 2927: [Poi1999]多边形之战 博弈论
- BZOJ 2929 Poi1999 洞穴攀行 最大流
- [Set 单调] BZOJ 2926 [Poi1999]空立方体问题
- bzoj 2936: [Poi1999]降 水 (floodfill算法)
- 【bzoj 2936】[Poi1999]降 水(floodfill算法(BFS))
- [博弈] BZOJ 2927 [Poi1999]多边形之战 Polygons
- [欧拉回路] BZOJ 2935 [Poi1999]原始生物 Primitivus
- [区间DP 中位数] BZOJ 2933 [Poi1999]地图 Map
- Html手记:框架标签
- 手机淘宝搜索排名的那些规则你知道多少?
- mysql数据库优化(一)
- poj 1182_食物链_并查集
- STL map简洁教程
- [高精度 递归] BZOJ 2930 [Poi1999]梦游者 Sleepwalker
- iOS开发 - 渐变导航条升级版(判断滚动的方向和改变方向时的位置)
- java 中的 sql 单引号双引号拼接变量
- Android软键盘监听KeyboardWatcher
- 最大和子矩阵
- 斐波那契数列的三种算法
- 【SSLGZ 1762】工厂的烦恼
- 6.7 Swift闭包捕获值
- Linux定时任务