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 ```