我其实只是存个模板……
真的只是存个模板……
而已啦……
支持高精度加减乘除以及快速幂……但是没有负数……(少用而且不想写……要的话自己写写符号位……)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int bi=1e4,MN=300; char c[1001]; struct big{ int a[MN]; inline big(){ memset(a,0,sizeof(a)); a[0]=1; } inline void read(){ register int i,j,k; memset(a,0,sizeof(a)); scanf("%s",c);k=strlen(c); a[0]=(k+3)/4; for (i=0;i<k;i++) j=(k-i+3)/4,a[j]=a[j]*10+c[i]-48; } inline void pr(){ register int i; printf("%d",a[a[0]]); for (i=a[0]-1;i;i--) printf("%04d",a[i]); } inline big operator =(int x){ if (x==0){ memset(a,0,sizeof(a)); a[0]=1; } a[0]=0; while (x){ a[0]++; a[a[0]]=x%bi; x/=bi; } if (!a[0]) a[0]=1; } inline big(int x){ *this=x; } inline void gl(){ while(!a[a[0]]&&a[0]>1) a[0]--; } inline void operator =(big x){ register int i; a[0]=x.a[0]; for (i=1;i<=a[0];i++) a[i]=x.a[i]; } inline bool operator >(big y){ if (a[0]!=y.a[0]) return a[0]>y.a[0]; for (register int i=a[0];i;i--){ if (a[i]!=y.a[i]) return a[i]>y.a[i]; } return 0; } inline bool operator >=(const big y){ if (a[0]!=y.a[0]) return a[0]>y.a[0]; for (register int i=a[0];i;i--){ if (a[i]!=y.a[i]) return a[i]>y.a[i]; } return 1; } inline bool operator <(big y){ if (a[0]!=y.a[0]) return a[0]<y.a[0]; for (register int i=a[0];i;i--){ if (a[i]!=y.a[i]) return a[i]<y.a[i]; } return 0; } inline bool operator <=(big y){ if (a[0]!=y.a[0]) return a[0]<y.a[0]; for (register int i=a[0];i;i--){ if (a[i]!=y.a[i]) return a[i]<y.a[i]; } return 1; } inline bool operator ==(big y){ if (a[0]!=y.a[0]) return 0; for (register int i=a[0];i;i--){ if (a[i]!=y.a[i]) return 0; } return 1; } inline bool operator !=(big y){ return !(*this==y); } inline bool operator ==(int y){ big x=y; return *this==x; } inline bool operator !=(int y){ return !(*this==y); } inline void swap(big &a,big &b){ big x=a;a=b;b=x; } inline big operator +(big x){ big r; if (a[0]<x.a[0]) r.a[0]=x.a[0];else r.a[0]=a[0]; for (register int i=1;i<=r.a[0];i++) r.a[i]=(i<=a[0]?a[i]:0)+(i<=x.a[0]?x.a[i]:0); for (register int i=1;i<=r.a[0];i++) if (r.a[i]>=bi){ r.a[i]-=bi;r.a[i+1]++; if (i==r.a[0]) r.a[0]++; } return r; } inline big operator +(int x){ big r;r=*this; r.a[1]+=x; for (register int i=1;i<=r.a[0];i++) if (r.a[i]>=bi){ r.a[i]-=bi;r.a[i+1]++; if (i==r.a[0]) r.a[0]++; }else break; return r; } inline big operator -(big x){ if (*this<x) swap(*this,x); register int i; big r; if (a[0]<x.a[0]) r.a[0]=x.a[0];else r.a[0]=a[0]; for (i=1;i<=r.a[0];i++) r.a[i]=a[i]-(i<=x.a[0]?x.a[i]:0); for (i=1;i<=r.a[0];i++) if (r.a[i]<0){ r.a[i+1]--;r.a[i]+=bi; } r.gl(); return r; } inline big operator -(int x){ register int i=1; big r;r=*this; r.a[1]-=x; while (r.a[i]<0) r.a[i+1]--,r.a[i]+=bi,i++; r.gl(); return r; } inline big operator *(big y){ register int i,j; big r;r.a[0]=a[0]+y.a[0]-1; for (i=1;i<=a[0];i++) for (j=1;j<=y.a[0];j++){ r.a[i+j-1]+=a[i]*y.a[j]; if (r.a[i+j-1]>=bi){ r.a[i+j]+=r.a[i+j-1]/bi; r.a[i+j-1]%=bi; if (i+j-1==r.a[0]) r.a[0]++; } } for (i=1;i<=r.a[0];i++) if (r.a[i]>=bi){ r.a[i+1]+=r.a[i]/bi; r.a[i]%=bi; if (i==r.a[0]) r.a[0]++; } return r; } inline big operator *(int y){ register int i,j; big r;r.a[0]=a[0]; for (i=1;i<=a[0];i++) r.a[i]=a[i]*y; for (i=1;i<=r.a[0];i++) if (r.a[i]>=bi){ r.a[i+1]+=r.a[i]/bi; r.a[i]%=bi; if (i==r.a[0]) r.a[0]++; } return r; } inline big half(){ register int i,j;big r=*this; for (i=r.a[0];i>1;i--) r.a[i-1]+=(r.a[i]%2)*bi,r.a[i]>>=1; r.a[1]>>=1; r.gl(); return r; } inline big operator /(big y){ register int i,j; big r,l,mid,rq=*this; r.a[0]=rq.a[0]+1;r.a[r.a[0]]=1; while(r>l){ mid=(l+r+big(1)).half(); if (mid*y<=rq) l=mid;else r=mid-big(1); } return l; } inline big operator %(big y){ register int i,j; big rq=*this; return rq-(rq/y*y); } inline big operator ^(int y){ big ans=1; big rq=*this; while(y){ if (y&1) ans=ans*rq; y>>=1; rq=rq*rq; } return ans; } inline big operator ^(big y){ big ans=1; big rq=*this; while(y!=0){ if (y.a[1]&1) ans=ans*rq; y=y/2; rq=rq*rq; } return ans; } }; int main(){ }
这是一个int128模版,用两个unsigned long long存储
#define ll unsigned long long ll M[2315]; struct MMH{ ll a,b; MMH(ll _a=0,ll _b=0):a(_a),b(_b){} void half(){ b>>=1; if (a&1) b|=1ull<<63; a>>=1; } void two(){ a<<=1; if (b&(1ull<<63)) a|=1; b<<=1; } }; MMH operator +(const MMH &x,const MMH &y){ MMH z; z.a=x.a+y.a;z.b=x.b+y.b;if (z.b<x.b||z.b<y.b) z.a++; return z; } MMH operator +(const MMH &x,const int &y){ MMH z=x; if ((z.b+y)<z.b) z.a++;z.b+=y; return z; } MMH operator -(const MMH &x,const MMH &y){ MMH z; z.a=x.a-y.a;z.b=x.b-y.b;if (y.b>x.b) z.a--; return z; } MMH operator -(const MMH &x,const int &y){ MMH z=x; if (z.b<y) z.a--;z.b-=y; return z; } bool operator <(const MMH &x,const MMH &y){return x.a==y.a?x.b<y.b:x.a<y.a;} bool operator >(const MMH &x,const MMH &y){return x.a==y.a?x.b>y.b:x.a>y.a;} bool operator !=(const MMH &x,const MMH &y){return x.a!=y.a||x.b!=y.b;} bool operator ==(const MMH &x,const MMH &y){return x.a==y.a&&x.b==y.b;} MMH operator *(const MMH &x,const MMH &y){ if (x.a){ TTT++; SSS-=clock(); MMH z=x,mmh=MMH(0,0),u=y; while (u.a|u.b){ if (u.b&1) mmh=mmh+z; z.two();u.half();_mmh++; } SSS+=clock(); return mmh; } ll s=(1ull<<32)-1; ll a=(x.b>>32)*(y.b>>32),_b1=(x.b&s)*(y.b>>32),b=_b1+(x.b>>32)*(y.b&s),c=(x.b&s)*(y.b&s),d; a+=(b<_b1)*1ull<<32; d=c+((b&s)<<32);a+=d<c;a+=b>>32; return MMH(a,d); }