1 ```
2 /*
3 高精度加法.
4 */
5 #include<cstring>
6 #include<cstdio>
7 #include<iostream>
8 #define MAXN 10001
9 using namespace std;
10 int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3;
11 char m[MAXN],n[MAXN];
12 void slove()
13 {
14 l3=max(l1,l2);
15 for(int i=1;i<=l3;i++)
16 {
17 c[i]+=a[i]+b[i];
18 c[i+1]+=c[i]/10;
19 c[i]%=10;
20 }
21 if(c[l3+1]) l3++;
22 while(!c[l3]&&l3>1) l3--;
23 for(int i=l3;i>=1;i--) printf("%d",c[i]);
24 }
25 int main()
26 {
27 freopen("add.in","r",stdin);
28 freopen("add.out","w",stdout);
29 scanf("%s",m+1);l1=strlen(m+1);
30 scanf("%s",n+1);l2=strlen(n+1);
31 for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
32 for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
33 slove();
34 return 0;
35 }
36 ```
37
38 ```
39 /*
40 高精度减法.
41 */
42 #include<cstring>
43 #include<cstdio>
44 #include<iostream>
45 #define MAXN 10001
46 using namespace std;
47 int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3;
48 char m[MAXN],n[MAXN];
49 void pre()
50 {
51 if(l1>l2)
52 {
53 for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
54 for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
55 }
56 else if(l1<l2){
57 printf("-");
58 for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48;
59 for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48;
60 }
61 else if(strcmp(m+1,n+1)>=0)
62 {
63 for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
64 for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
65 }
66 else {
67 printf("-");
68 for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48;
69 for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48;
70 }
71 }
72 void slove()
73 {
74 l3=max(l1,l2);
75 for(int i=1;i<=l3;i++)
76 {
77 if(a[i]<b[i]) a[i+1]--,a[i]+=10;
78 c[i]=a[i]-b[i];
79 }
80 while(!c[l3]&&l3>1) l3--;
81 for(int i=l3;i>=1;i--) printf("%d",c[i]);
82 }
83 int main()
84 {
85 freopen("sub.in","r",stdin);
86 freopen("sub.out","w",stdout);
87 scanf("%s",m+1);l1=strlen(m+1);
88 scanf("%s",n+1);l2=strlen(n+1);
89 pre();
90 slove();
91 return 0;
92 }
93 ```
94
95 ```
96 /*
97 高精度乘法.
98 */
99 #include<cstring>
100 #include<cstdio>
101 #include<iostream>
102 #define MAXN 10001
103 using namespace std;
104 int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3;
105 char m[MAXN],n[MAXN];
106 void slove()
107 {
108 int x;
109 l3=l1+l2;
110 for(int i=1;i<=l1;i++)
111 {
112 int x=0;
113 for(int j=1;j<=l2;j++)
114 {
115 c[i+j-1]+=a[i]*b[j];
116 c[i+j]+=c[i+j-1]/10;
117 x=c[i+j-1]/10;
118 c[i+j-1]%=10;
119 }
120 c[i+l2]=x;
121 }
122 if(c[l3+1]) l3++;
123 while(!c[l3]&&l3>1) l3--;
124 for(int i=l3;i>=1;i--) printf("%d",c[i]);
125 }
126 int main()
127 {
128 freopen("mul.in","r",stdin);
129 freopen("mul.out","w",stdout);
130 scanf("%s",m+1);l1=strlen(m+1);
131 scanf("%s",n+1);l2=strlen(n+1);
132 for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
133 for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
134 slove();
135 return 0;
136 }
137 ```
138
139 ```
140 /*
141 高精度除法.
142 */
143 #include<cstring>
144 #include<cstdio>
145 #include<iostream>
146 #define MAXN 10001
147 using namespace std;
148 int a[MAXN],b[MAXN],c[MAXN],tmp[MAXN],l1,l2,l3;
149 char m[MAXN],n[MAXN];
150 bool cmp()
151 {
152 if(tmp[0]>l1) return false;
153 if(l1>tmp[0]) return true;
154 for(int i=l1;i>=1;i--)
155 {
156 if(a[i]>tmp[i]) return true;
157 if(a[i]<tmp[i]) return false;
158 }
159 return true;
160 }
161 bool cmp1()
162 {
163 for(int i=1;i<=l1;i++)
164 {
165 if(m[i]>n[i]) return true;
166 if(m[i]<n[i]) return false;
167 }
168 return true;
169 }
170 void slovejian()
171 {
172 for(int i=1;i<=l1;i++)
173 {
174 if(a[i]<tmp[i]) a[i+1]--,a[i]+=10;
175 a[i]-=tmp[i];
176 }
177 while(!a[l1]&&l1>1) l1--;
178 }
179 void slove()
180 {
181 l3=l1-l2+1;
182 for(int i=l3;i>=1;i--)
183 {
184 memset(tmp,0,sizeof tmp);
185 for(int j=1;j<=l2;j++) tmp[i+j-1]=b[j];
186 tmp[0]=l2+i-1;
187 while(cmp()) c[i]++,slovejian();
188 }
189 while(!c[l3]&&l3>1) l3--;
190 for(int i=l3;i>=1;i--) printf("%d",c[i]);
191 }
192 int main()
193 {
194 scanf("%s",m+1);l1=strlen(m+1);
195 scanf("%s",n+1);l2=strlen(n+1);
196 if(l1>l2)
197 {
198 for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
199 for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
200 }
201 else if(l1<l2)
202 {
203 for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48;
204 for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48;
205 int t;t=l1,l1=l2,l2=t;
206 }
207 else if(cmp1())
208 {
209 for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
210 for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
211 }
212 else
213 {
214 for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48;
215 for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48;
216 int t;t=l1,l1=l2,l2=t;
217 }
218 slove();
219 return 0;
220 }
221 ```
222 ```
223 /*
224 高精度取模求余.
225 */
226 #include<cstring>
227 #include<cstdio>
228 #include<iostream>
229 #define MAXN 10001
230 using namespace std;
231 int a[MAXN],b[MAXN],ans[MAXN],c[MAXN],tmp[MAXN],l1,l2,l3;
232 char m[MAXN],n[MAXN];
233 bool cmp()
234 {
235 if(tmp[0]>l1) return false;
236 if(l1>tmp[0]) return true;
237 for(int i=l1;i>=1;i--)
238 {
239 if(a[i]>tmp[i]) return true;
240 if(a[i]<tmp[i]) return false;
241 }
242 return true;
243 }
244 void slovejian()
245 {
246 for(int i=1;i<=l1;i++)
247 {
248 if(a[i]<tmp[i]) a[i+1]--,a[i]+=10;
249 a[i]-=tmp[i];
250 }
251 while(!a[l1]&&l1>1) l1--;
252 }
253 void chu()
254 {
255 l3=l1-l2+1;
256 for(int i=l3;i>=1;i--)
257 {
258 memset(tmp,0,sizeof tmp);
259 for(int j=1;j<=l2;j++) tmp[i+j-1]=b[j];
260 tmp[0]=l2+i-1;
261 while(cmp()) c[i]++,slovejian();
262 }
263 }
264 void mul()
265 {
266 memset(tmp,0,sizeof tmp);
267 tmp[0]=l2+l3;
268 for(int i=1;i<=l2;i++)
269 {
270 int x=0;
271 for(int j=1;j<=l3;j++)
272 {
273 tmp[i+j-1]+=b[i]*c[j];
274 x=tmp[i+j-1]/10;
275 tmp[i+j]+=tmp[i+j-1]/10;
276 tmp[i+j-1]%=10;
277 }
278 tmp[i+l3]=x;
279 }
280 if(tmp[tmp[0]+1]) tmp[0]++;
281 while(tmp[tmp[0]]&&tmp[0]>1) tmp[0]--;
282 }
283 void slove()
284 {
285 chu();mul();
286 ans[0]=max(l2,l3);
287 for(int i=1;i<=ans[0];i++)
288 {
289 if(ans[i]<tmp[i]) ans[i+1]--,ans[i]+=10;
290 ans[i]-=tmp[i];
291 }
292 while(!ans[ans[0]]&&ans[0]>1) ans[0]--;
293 for(int i=ans[0];i>=1;i--) printf("%d",ans[i]);
294 }
295 int main()
296 {
297 scanf("%s",m+1);l1=strlen(m+1);
298 scanf("%s",n+1);l2=strlen(n+1);
299 for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48,ans[i]=a[i];
300 for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
301 slove();
302 return 0;
303 }
304 ```
305 ```
306 /*
307 高精度错排公式.
308 f[n]=(n-1)(f[n-1]+f[n-2]).
309 */
310 #include<iostream>
311 #include<cstring>
312 #include<cstdio>
313 #define MAXN 201
314 #define MAXM 1001
315 using namespace std;
316 int f[MAXN][MAXM],n,tmp[MAXM],t[MAXM];
317 int read()
318 {
319 int x=0,f=1;char ch=getchar();
320 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
321 while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
322 return x*f;
323 }
324 void slove(int x)
325 {
326 memset(t,0,sizeof t);
327 while(x) t[++t[0]]=x%10,x/=10;return ;
328 }
329 void add(int c[],int a[],int b[])
330 {
331 c[0]=a[0]+b[0];
332 for(int i=1;i<=c[0];i++)
333 {
334 c[i]+=a[i]+b[i];
335 c[i+1]+=c[i]/10;
336 c[i]%=10;
337 }
338 if(c[c[0]+1]) c[0]++;
339 while(!c[c[0]]&&c[0]>1) c[0]--;
340 return;
341 }
342 void mul(int c[],int a[],int b[])
343 {
344 c[0]=a[0]+b[0];
345 for(int i=1;i<=a[0];i++)
346 {
347 int x=0;
348 for(int j=1;j<=b[0];j++)
349 {
350 c[i+j-1]+=a[i]*b[j];
351 c[i+j]+=c[i+j-1]/10;
352 x=c[i+j-1]/10;
353 c[i+j-1]%=10;
354 }
355 c[i+b[0]]=x;
356 }
357 while(!c[c[0]]&&c[0]>1) c[0]--;
358 return;
359 }
360 int main()
361 {
362 n=read();
363 if(n==0){printf("1");return 0;}
364 f[1][0]=1,f[1][1]=0;
365 f[2][0]=1,f[2][1]=1;
366 for(int i=3;i<=n;i++)
367 {
368 memset(tmp,0,sizeof tmp);
369 add(tmp,f[i-1],f[i-2]);
370 slove(i-1);
371 mul(f[i],t,tmp);
372 }
373 for(int i=f[n][0];i>=1;i--) printf("%d",f[n][i]);
374 return 0;
375 }
376 ```