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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| const int Length=10005; string add(const string &a,const string &b) { string ans; int na[Length]={0},nb[Length]={0}; int la=a.size(),lb=b.size(); for(int i=0;i<la;i++) na[la-1-i]=a[i]-'0'; for(int i=0;i<lb;i++) nb[lb-1-i]=b[i]-'0'; int lmax=la>lb?la:lb; for(int i=0;i<lmax;i++) na[i]+=nb[i],na[i+1]+=na[i]/10,na[i]%=10; if(na[lmax]) lmax++; for(int i=lmax-1;i>=0;i--) ans+=na[i]+'0'; return ans; } string mul(const string &a,const string &b) { string s; int na[Length],nb[Length],nc[Length],La=a.size(),Lb=b.size(); fill(na,na+Length,0);fill(nb,nb+Length,0);fill(nc,nc+Length,0); for(int i=La-1;i>=0;i--) na[La-i]=a[i]-'0'; for(int i=Lb-1;i>=0;i--) nb[Lb-i]=b[i]-'0'; for(int i=1;i<=La;i++) for(int j=1;j<=Lb;j++) nc[i+j-1]+=na[i]*nb[j]; for(int i=1;i<=La+Lb;i++) nc[i+1]+=nc[i]/10,nc[i]%=10; if(nc[La+Lb]) s+=nc[La+Lb]+'0'; for(int i=La+Lb-1;i>=1;i--) s+=nc[i]+'0'; return s; } int sub(int *a,int *b,int La,int Lb) { if(La<Lb) return -1; if(La==Lb) { for(int i=La-1;i>=0;i--) if(a[i]>b[i]) break; else if(a[i]<b[i]) return -1; } for(int i=0;i<La;i++) { a[i]-=b[i]; if(a[i]<0) a[i]+=10,a[i+1]--; } for(int i=La-1;i>=0;i--) if(a[i]) return i+1; return 0; } string div(const string &n1,const string &n2,int nn) { string s,v; int a[Length],b[Length],r[Length],La=n1.size(),Lb=n2.size(),i,tp=La; fill(a,a+Length,0);fill(b,b+Length,0);fill(r,r+Length,0); for(i=La-1;i>=0;i--) a[La-1-i]=n1[i]-'0'; for(i=Lb-1;i>=0;i--) b[Lb-1-i]=n2[i]-'0'; if(La<Lb || (La==Lb && n1<n2)) { return n1; } int t=La-Lb; for(int i=La-1;i>=0;i--) if(i>=t) b[i]=b[i-t]; else b[i]=0; Lb=La; for(int j=0;j<=t;j++) { int temp; while((temp=sub(a,b+j,La,Lb-j))>=0) { La=temp; r[t-j]++; } } for(i=0;i<Length-10;i++) r[i+1]+=r[i]/10,r[i]%=10; while(!r[i]) i--; while(i>=0) s+=r[i--]+'0'; i=tp; while(!a[i]) i--; while(i>=0) v+=a[i--]+'0'; if(v.empty()) v="0"; if(nn==1) return s; if(nn==2) return v; } bool judge(const string &s) { for(int i=0;i<s.size();i++) if(s[i]!='0') return false; return true; } string gcd(string a,string b) { if(a.length()<b.length()) swap(a,b); else if(a<b) swap(a,b); string t; while(!judge(b)) { t=a; a=b; b=div(t,b,2); } return a; }
|