1 #include <iostream>
2 #include <cstdio>
3 #include <algorithm>
4 #include <cstring>
5 #include <string>
6 #include <vector>
7 #include <map>
8 #include <set>
9 #include <queue>
10 #include <list>
11 #include <cstdlib>
12 #include <iterator>
13 #include <cmath>
14 #include <iomanip>
15 #include <bitset>
16 #include <cctype>
17
18 using namespace std;
19 #define cin_1(a) scanf("%d",&a)
20 #define cin_2(a,b) scanf("%d%d",&a,&b)
21 #define cin_3(a,b,c) scanf("%d%d%d",&a,&b,&c)
22 #define max_2(a,b) a>b?a:b
23 #define max_3(a,b,c) max_2(max_2(a,b),c)
24 #define ll long long
25 #define rint register int
26 #define mem0(x) memset(x, 0, sizeof(x))
27 #define mem1(x) memset(x, -1, sizeof(x))
28 inline int read()///神奇的读优
29 {
30 int x=0,f=1;char c=getchar();
31 while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
32 while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
33 return x*f;
34 }
35 const int inf = 0x3f3f3f3f;
36 const ll inff = 0x3f3f3f3f3f3f3f3f;
37 //map<ll,ll>mp;
38 //set<ll>st;
39 /***********************************************/
40 bool judge(string str1,string str2)///是否str1小于str2
41 {
42 int len1=str1.length();
43 int len2=str2.length();
44 if(len1<len2 || (len1==len2 && str1<str2)) return 1;
45 return 0;
46 }
47
48 string add(string str1,string str2)///高精度加法
49 {
50 string str;
51 vector<int>x,y;
52 int len1=str1.length();
53 int len2=str2.length();
54 int len=max(len1,len2);
55 for(int i=len1-1;i>=0;i--) x.push_back(str1[i]-'0');
56 for(int i=len2-1;i>=0;i--) y.push_back(str2[i]-'0');
57 for(int i=0;i<len;i++)
58 {
59 if(i<len1 && i<len2) x[i]+=y[i];
60 else if(i>=len1 && i<len2) x.push_back(y[i]);
61 }
62 for(int i=0;i<len-1;i++)///进位
63 if(x[i]>=10) { x[i+1]+=x[i]/10; x[i]%=10; }
64 if(x[len-1]>=10){
65 x.push_back(x[len-1]/10);
66 x[len-1]%=10;
67 len++;
68 }
69 for(int i=len-1;i>=0;i--) str+=x[i]+'0';
70 return str;
71 }
72
73 string sub(string str1,string str2)///高精度减法
74 {
75 int f=0;
76 string str;
77 vector<int>x,y;
78 int len1=str1.length();
79 int len2=str2.length();
80 if(len1<len2 || (len1==len2 && str1<str2)){swap(str1,str2);swap(len1,len2);f=1;}
81 for(int i=len1-1;i>=0;i--) x.push_back(str1[i]-'0');
82 for(int i=len2-1;i>=0;i--) y.push_back(str2[i]-'0');
83 for(int i=0;i<len2;i++) x[i]-=y[i];
84 for(int i=0;i<len1-1;i++) if(x[i]<0){x[i+1]--;x[i]+=10;}///进位
85 while(x[len1-1]==0 && len1>1) len1--;///去前导0
86 if(f) str+='-';
87 for(int i=len1-1;i>=0;i--) str+='0'+x[i];
88 return str;
89 }
90
91 string mul(string str1,string str2)///高精度乘法
92 {
93 string str;
94 str+='0';
95 vector<int>x,y;
96 int len1=str1.length();
97 int len2=str2.length();
98 for(int i=len1-1;i>=0;i--) x.push_back(str1[i]-'0');
99 for(int i=len2-1;i>=0;i--) y.push_back(str2[i]-'0');
100 for(int i=0;i<len1;i++)
101 {
102 int yy=len2;
103 vector<int>z;
104 for(int j=0;j<len2;j++) z.push_back(x[i]*y[j]);
105 for(int j=0;j<len2-1;j++) if(z[j]>=10) {z[j+1]+=z[j]/10; z[j]%=10; }///进位
106 while(z[len2-1]>=10) { z.push_back(z[len2-1]/10);z[len2-1]%=10;len2++; }
107 for(int k=1;k<=i;k++) z.push_back(0);
108 for(int k=len2-1;k>=0;k--) swap(z[k],z[k+i]);
109 len2+=i;
110 while(z[len2-1]==0 && len2>1) len2--;///去前导0
111 string t;
112 for(int ii=len2-1;ii>=0;ii--) t+='0'+z[ii];
113 str=add(str,t);
114 len2=yy;
115 }
116 return str;
117 }
118
119 string div(string str1,string str2) ///高精度除法 str1/str2
120 {
121 string str,t;
122 int len1=str1.length();
123 int len2=str2.length();
124 for(int i=0;i<len1;i++)
125 {
126 t+=str1[i];
127 string g;
128 for(int k=1;k<=10;k++)///试商
129 {
130 g='0'+k;
131 if(judge(t,mul(g,str2))) ///试商成功
132 {
133 if(str.length()==0 && k==1) ;
134 else str+='0'+k-1;///商为 k-1
135 g='0'+k-1;
136 t=sub(t,mul(g,str2));
137 if(t[0]=='0') t="";
138 break;
139 }
140 }
141 }
142 if(str.length()==0) str+='0';
143 return str;
144 }
145
146 int main() {
147
148 return 0;
149 }