高精乘低精&高精除低精
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define il inline
#define ri register
#define pc(i) putchar(i)
using namespace std;
int n,id=1;
struct G{
char c[10002];int o[10002],len;
G(){len=1;}
il void W(const G &x){for(ri int i=len;i>=1;--i) printf("%d",x.o[i]);}
il void C(G &x){x.len=strlen(x.c); for(ri int i=0;i<x.len;i++) x.o[x.len-i]=(x.c[i]^48);}
};
il G operator*(G x,G y)
{
G re;memset(re.o,0,sizeof(re.o));
if(x.len>y.len) swap(x,y);
for(ri int i=1;i<=x.len;++i)
for(ri int j=1;j<=y.len;++j) re.o[j+i-1]+=y.o[j]*x.o[i];
for(ri int i=1;i<=x.len+y.len+1;++i) re.o[i+1]+=re.o[i]/10,re.o[i]%=10;
for(ri int i=9999;i>=1;--i) if(re.o[i]!=0) {re.len=i;break;}
if(!re.len) re.len=1;
return re;
}
il G operator/(G x,G y)
{
G re;memset(re.o,0,sizeof(re.o));
if(y.len>x.len) swap(y,x);int lst=0,s=0;
for(ri int i=y.len;i>=1;--i) s=(s<<3)+(s<<1)+y.o[i];
for(ri int i=x.len;i>=1;--i) re.o[i]=(lst*10+x.o[i])/s,lst=(x.o[i]+lst*10)%s;
for(ri int i=9999;i>=1;--i) if(re.o[i]!=0) {re.len=i;break;}
if(!re.len) re.len=1;
return re;
}
il bool operator>(const G x,const G y)
{
if(x.len>y.len) return true;
else if(x.len<y.len) return false;
else for(ri int i=1;i<=x.len;++i)
if(x.o[i]<y.o[i]) return false;
else if(x.o[i]>y.o[i]) return true;
return false;
}