| 12
 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;
 }
 
 |