rt,手打了一个高精重载模板,不知道是否有误,求大佬帮忙找错thx
没写除法,且还待完善
struct hp{
int k,Size;
hp(){memset(a,0,sizeof(a)); k=1; Size=1; return;}
int a[100010];
inline hp operator*(const hp &p) const{
hp t;
for(int i=1;i<=Size;i++) for(int j=1;j<=Size;j++) t.a[i+j-1]+=a[i]*p.a[j];
for(int i=1;i<=Size+p.Size;i++) t.a[i+1]+=t.a[i]/10,t.a[i]%=10;
int s=100000; while(!t.a[s]) s--; t.Size=s;
return t;
}
inline hp operator*(const int &p){
hp t;
for(int i=1;i<=Size;i++) t.a[i]=a[i]*p;
for(int i=1;i<=Size+10;i++) t.a[i+1]+=t.a[i]/10,t.a[i]%=10;
int s=100000; while(!t.a[s]) s--; t.Size=s;
return t;
}
inline void operator*=(const hp &p){
hp t;
for(int i=1;i<=Size;i++) for(int j=1;j<=Size;j++) t.a[i+j-1]+=a[i]*p.a[j];
for(int i=1;i<=Size+p.Size;i++) t.a[i+1]+=t.a[i]/10,t.a[i]%=10;
int s=100000; while(!t.a[s]) s--; Size=s;
for(int i=1;i<=Size;i++) a[i]=t.a[i];
}
inline void operator*=(const int &p){
hp t;
for(int i=1;i<=Size;i++) t.a[i]=a[i]*p;
for(int i=1;i<=Size+10;i++) t.a[i+1]+=t.a[i]/10,t.a[i]%=10;
int s=100000; while(!t.a[s]) s--; Size=s;
for(int i=1;i<=Size;i++) a[i]=t.a[i];
}
inline hp operator+(const hp &p){
hp t;
for(int i=1;i<=Size;i++) t.a[i]=a[i];
Size=max(p.Size,Size),t.Size=Size;
for(int i=1;i<=Size;i++) t.a[i]+=p.a[i],t.a[i+1]+=t.a[i]/10,t.a[i]%=10;
if(t.a[t.Size+1]) t.Size++;
return t;
}
inline hp operator+(const int &p){
hp t;
for(int i=1;i<=Size;i++) t.a[i]=a[i];
t.a[1]+=p,t.Size=Size;
for(int i=1;i<=Size;i++) t.a[i+1]+=t.a[i]/10,t.a[i]%=10;
while(t.a[t.Size+1]) t.Size++;
return t;
}
inline void operator+=(const int &p){
a[1]+=p;
for(int i=1;i<=Size+10;i++) a[i+1]+=a[i]/10,a[i]%=10;
while(a[Size+1]) Size++;
}
inline void operator+=(const hp &p){
for(int i=1;i<=Size+p.Size;i++) a[i]+=p.a[i],a[i+1]+=a[i]/10,a[i]%=10;
while(a[Size+1]) Size++;
}
inline int operator<(const hp &p) const{
for(int i=Size;i;i--){
if(a[i]>p.a[i]) return 0;
if(a[i]<p.a[i]) return 1;
}
return 0;
}
inline hp operator-(const hp &p) const{
hp t;
for(int i=1;i<=Size;i++){
t.a[i]=a[i]-p.a[i];
if(t.a[i]<0) t.a[i]+=10,t.a[i+1]--;
}
return t;
}
inline void read(){
char c;
while((c=getchar())<'0' || c>'9');
while(c>='0' && c<='9'){
for(int i=Size;i>1;i--) a[i]=a[i-1];
a[1]=c^48,c=getchar(),Size++;
}
}
inline void write(){
int i=Size;
while(i && !a[i]) i--;
while(i) putchar(a[i--]+'0');
return;
}
};