1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| define N 1e5 struct bign { int len; int v[N]; bign operator = (char* s) { len=strlen(s); memset(v,0,sizeof(v)); for(int i=0;i<len;i++) v[i]=s[len-i-1]-'0'; return *this; } bign operator = (int x) { char s[N]; sprintf(s,"%d",x); return *this=s; } bign operator + (const bign &b) const { bign c; memset(c.v,0,sizeof(c.v)); c.len=max(len,b.len); for(int i=0;i<c.len;i++) c.v[i]=v[i]+b.v[i]; for(int i=0;i<c.len;i++) { c.v[i+1]+=c.v[i]/10; c.v[i]%=10; } if(c.v[c.len]) c.len++; return c; } bign operator * (const bign &b) const { bign c; memset(c.v,0,sizeof(c.v)); c.len=len+b.len; for(int i=0;i<len;i++) for(int j=0;j<b.len;j++) c.v[i+j]+=v[i]*b.v[j]; for(int i=0;i<len;i++) { c.v[i+1]=c.v[i]/10; c.v[i]%=10; } while(c.len>1 && c.v[c.len-1]) c.len--; return c; } bign operator += (const bign &b) { return *this+b; } bool operator < (const bign &b) const { if(len<b.len) return 1; if(len>b.len) return 0; for(int i=len-1;i>=0;i--) { if(v[i]<b.v[i]) return 1; if(v[i]>b.v[i]) return 0; } return 0; } bool operator > (const bign &b) const { return b<*this; } bool operator <= (const bign &b) const { return !(b>*this); } bool operator >= (const bign &b) const { return !(b<*this); } bool operator == (const bign &b) const { return (b>*this)^(b<*this) } };
|