# GÓC SÁNG TẠO > Khu vực lập trình > Pascal/Delphi/Kylix >  Thuật toán giải Toán Cao Cấp!

## citybuilder1102

*Tại đây post các giải thuật giải các bài toán cao cấp thuộc chương trình cao đẳng, đại học của Bộ Giáo Dục.*
<div style="text-align: center">*Yêu cầu không spam tại topic này. Nếu có sẽ bị cảnh cáo.*
​</div>

----------


## Dương Trúc Vy

Vì em chưa lên đại học nên chưa biết các thuật toán trong chương trình đại học nhưng có bài này mới đọc được. Anh xem thử nó có cao cấp không nhé:

Nhân dịp kỷ niệm 40 năm Khối chuyên Toán - Tin, các học sinh đang học ở Khối và các cựu học sinh của Khối từ khắp nơi trên thế giới tập hợp về ký túc xá Mễ Trì cắm trại. Có tất cả N trại đánh số 1..N và M đoạn đường hai chiều, mỗi đoạn đường nối hai trại khác nhau, giữa hai trại có không quá một đoạn đường, hai đoạn đường khác nhau không cắt nhau tại điểm khác trại. Trên các đoạn đường có rất nhiều quán ẩm thực nên sau khi kết thúc trại, cần dọn sạch các đoạn đường. Công việc này giao cho các cựu học sinh do anh Nguyễn Thành Nam (FSoft) chỉ huy. Do phải về công ty sớm để hoàn thành một phần mềm, anh Nam muốn phân chia M đoạn đường thành một số nhóm đường sao cho các điều kiện sau được thoả mãn: 
Mỗi đoạn đường thuộc đúng một nhóm.Việc dọn sạch mỗi nhóm đường do một xe tự hành đảm nhiệm. Mỗi nhóm đường cần chọn sao cho xe tự hành có thể đi liên tiếp qua các đoạn đường thuộc nhóm và chỉ đi qua mỗi đoạn đường đúng một lần.Số nhóm (tức là số xe tự hành cần dùng) ít nhất có thể được. Input: *CAMTRAI.INP*
Dòng thứ nhất ghi hai số nguyên dương N, M. 
Trong M dòng tiếp theo, mỗi dòng ghi tên 2 trại là 2 đầu của một đoạn đường.
Output: *CAMTRAI.OUT*
Dòng thứ nhất ghi số nguyên dương K là số nhóm đường. 
 Trong K dòng tiếp theo, mỗi dòng ghi một hành trình của xe tự hành qua nhóm đường tương ứng từ đỉnh bắt đầu, qua các đỉnh trung gian đến đỉnh kết thúc của hành trình.
Ví dụ:
<div style="text-align: center">*CAMTRAI.INP*
4 2 ​</div>1 2
 4 3
*CAMTRAI.OUT*
 2
 1 2
 3 4

Bài này tìm thấy trong 1 đề của trường đại học khoa học tự nhiên.
Bài này theo em nên dùng thuật toán tìm đường đi euler xuất phát từ những đỉnh có bậc lẻ (nếu có) nếu không có đỉnh bậc lẻ thì từ đỉnh bậc chẵn bất kì, tìm được đường nào tức là dùng 1 xe, sau đó giảm bậc của những đỉnh đã đi qua và tìm tiếp cho tới khi không còn đỉnh nào có bậc >0 thì in ra.

----------


## phungnham92

Nguyên văn bài này là từ kì thi của Ba Lan bạn ạ
http://www.spoj.pl/problems/PRIMIT/
Cách làm dựa trên định lý tồn tại đường đi hay chu trình Euler nhưng cách làm ko cần phải cài đặt tìm đường đi euler.

----------


## adviser

*CHƯƠNG I- VECTƠ, MA TRẬN, HỆ PHƯƠNG TRÌNH ĐẠI SỐ TUYẾN TÍNH

Mong sự đóng góp của các bạn về các bài toán liên quan đến chủ đề của chương 1 và nếu có thể post code hoặc hướng dẫn nếu có thể.

*​

----------


## seothamtraisan

*Bài* *"TÍCH VECTƠ N CHIỀU"*



```
Program Tich_Vecto_N_Chieu;
Uses Crt;
Var i, n : Integer;
    p, a : Real;
    x, y, z : Array[1..100] Of Real;

Begin
     Clrscr;
     Writeln('Chuong trinh tinh tich vecto n chieu');
     Write('Nhap chieu cua 2 vecto n = ');
     Readln(n);
     Writeln('Nhap toa do cua 2 vecto');
     For i := 1 To n Do
     Begin
          Write('x[',i,'] = ');
          Readln(x[i]);
          Write('y[',i,'] = ');
          Readln(y[i]);
     End;
     Write('a = ');
     Readln(a);
     For i := 1 To n Do
     Begin
          If (x[i]+y[i]) < 0 Then z[i] := sqr(x[i]+y[i]);
          If (x[i]+y[i]) >= a Then z[i] := x[i] + y[i];
          If (x[i]+y[i]) < a Then z[i] := 0;
          Writeln('z[',i,'] = ',z[i]:10:3);
     End;
     p := 0;
     For i := 1 To n Do
     Begin
          p := p + x[i] * z[i];
     End;
     Writeln('Tich vo huong cua x va z la: ',p:10:3);
     Readln;
End.
```

*Bài* *"TÌM MA TRẬN CHUYỂN VỊ"*




```
Program Ma_Tran_Chuyen_Vi;
Uses Crt;
Const p = ',';

Var i, j, m, n : Integer;
    a, b : Array[1..10,1..10] Of Real;

Begin
     Clrscr;
     Writeln('Chuong trinh tinh ma tran chuyen vi');
     Writeln('===================================');
     Writeln('So hang m = ');
     Readln(m);
     Writeln('So cot n = ');
     Readln(n);
     Writeln('Vao ma tran A[m, n]');
     For i := 1 To m Do
          For j := 1 To n Do
          Begin
               Write('A[',i,'] = ');
               Readln(A[i, j]);
          End;
     For i := 1 To m Do
          For j := 1 To n Do B[i, j] := A[j, i];
     For i := 1 To m Do
     Begin
          For j := 1 To n Do Write(B[i, j]:5:2);
          Writeln;
     End;
     Readln;
End.
```

----------


## kenshin

*Bài* *"NHÂN 2 MA TRẬN"*



```

Program Nhan_Ma_Tran_Vuong 



```



```

[COLOR=#007700];[/COLOR][COLOR=#0000BB]Uses Crt[/COLOR][COLOR=#007700];Const [/COLOR][COLOR=#0000BB]max [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]50[/COLOR][COLOR=#007700];Var [/COLOR][COLOR=#0000BB]n[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]j[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]k [/COLOR][COLOR=#007700]: [/COLOR][COLOR=#0000BB]Integer[/COLOR][COLOR=#007700];    [/COLOR][COLOR=#0000BB]A[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]B[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]C [/COLOR][COLOR=#007700]: Array[[/COLOR][COLOR=#0000BB]1.[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]max[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]1.[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]max[/COLOR][COLOR=#007700]] [/COLOR][COLOR=#0000BB]Of Real[/COLOR][COLOR=#007700];[/COLOR][COLOR=#0000BB]Begin     Clrscr[/COLOR][COLOR=#007700];     [/COLOR][COLOR=#0000BB]Writeln[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'Chuong trinh NHAN 2 MA TRAN VUONG'[/COLOR][COLOR=#007700]);     [/COLOR][COLOR=#0000BB]Writeln[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'================================='[/COLOR][COLOR=#007700]);     [/COLOR][COLOR=#0000BB]Write[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'Nhap n = '[/COLOR][COLOR=#007700]);     [/COLOR][COLOR=#0000BB]Readln[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]n[/COLOR][COLOR=#007700]);     For [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]:= [/COLOR][COLOR=#0000BB]1 To n [/COLOR][COLOR=#007700]Do          For [/COLOR][COLOR=#0000BB]j [/COLOR][COLOR=#007700]:= [/COLOR][COLOR=#0000BB]1 To n [/COLOR][COLOR=#007700]Do          [/COLOR][COLOR=#0000BB]Begin               Write[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'A['[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]j[/COLOR][COLOR=#007700],[/COLOR][COLOR=#DD0000]'] = '[/COLOR][COLOR=#007700]);               [/COLOR][COLOR=#0000BB]Readln[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]A[/COLOR][COLOR=#007700][[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]j[/COLOR][COLOR=#007700]]);               [/COLOR][COLOR=#0000BB]Write[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'B['[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]j[/COLOR][COLOR=#007700],[/COLOR][COLOR=#DD0000]'] = '[/COLOR][COLOR=#007700]);               [/COLOR][COLOR=#0000BB]Readln[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]B[/COLOR][COLOR=#007700][[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]j[/COLOR][COLOR=#007700]]);          [/COLOR][COLOR=#0000BB]End[/COLOR][COLOR=#007700];     For [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]:= [/COLOR][COLOR=#0000BB]1 To n [/COLOR][COLOR=#007700]Do          For [/COLOR][COLOR=#0000BB]j [/COLOR][COLOR=#007700]:= [/COLOR][COLOR=#0000BB]1 To n [/COLOR][COLOR=#007700]Do          [/COLOR][COLOR=#0000BB]Begin               C[/COLOR][COLOR=#007700][[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]j[/COLOR][COLOR=#007700]] := [/COLOR][COLOR=#0000BB]0[/COLOR][COLOR=#007700];               For [/COLOR][COLOR=#0000BB]k [/COLOR][COLOR=#007700]:= [/COLOR][COLOR=#0000BB]1 To n [/COLOR][COLOR=#007700]Do [/COLOR][COLOR=#0000BB]C[/COLOR][COLOR=#007700][[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]j[/COLOR][COLOR=#007700]] := [/COLOR][COLOR=#0000BB]C[/COLOR][COLOR=#007700][[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]j[/COLOR][COLOR=#007700]] + [/COLOR][COLOR=#0000BB]A[/COLOR][COLOR=#007700][[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]k[/COLOR][COLOR=#007700]] * [/COLOR][COLOR=#0000BB]B[/COLOR][COLOR=#007700][[/COLOR][COLOR=#0000BB]k[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]j[/COLOR][COLOR=#007700]];          [/COLOR][COLOR=#0000BB]End[/COLOR][COLOR=#007700];     [/COLOR][COLOR=#0000BB]Writeln[/COLOR][COLOR=#007700]([/COLOR][COLOR=#DD0000]'Tich cua 2 ma tran tren la'[/COLOR][COLOR=#007700]);     For [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]:= [/COLOR][COLOR=#0000BB]1 To n [/COLOR][COLOR=#007700]Do     [/COLOR][COLOR=#0000BB]Begin          [/COLOR][COLOR=#007700]For [/COLOR][COLOR=#0000BB]j [/COLOR][COLOR=#007700]:= [/COLOR][COLOR=#0000BB]1 To n [/COLOR][COLOR=#007700]Do [/COLOR][COLOR=#0000BB]Write[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]C[/COLOR][COLOR=#007700][[/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700],[/COLOR][COLOR=#0000BB]j[/COLOR][COLOR=#007700]]:[/COLOR][COLOR=#0000BB]10[/COLOR][COLOR=#007700]:[/COLOR][COLOR=#0000BB]3[/COLOR][COLOR=#007700]);          [/COLOR][COLOR=#0000BB]Writeln[/COLOR][COLOR=#007700];     [/COLOR][COLOR=#0000BB]End[/COLOR][COLOR=#007700];     [/COLOR][COLOR=#0000BB]Readln[/COLOR][COLOR=#007700];[/COLOR][COLOR=#0000BB]End[/COLOR][COLOR=#007700].[/COLOR] 



```

----------


## dksupport

*Bài* *"ĐỊNH THỨC CẤP N"*



```
Program Dinh_Thuc_Cap_N;
Uses Crt;
Const max = 50;

Var i, j, k, n : Integer;
    ok1, ok2   : Boolean;
    d, c       : Real;
    a          : Array[1..max, 1..max] Of Real;

Begin
     Clrscr;
     Writeln('TINH DINH THUC CAP N');
     Writeln('====================');
     Write('Nhap vao bac cua dinh thuc n = ');
     Readln(n);
     Writeln('Nhap MA TRAN A');
     For i := 1 To n Do
     Begin
          Writeln('Dong ',i,' : ');
          For j := 1 To n Do
          Begin
               Write('A[',i,j,'] = ');
               Read(A[i,j]);
          End;
          Writeln;
     End;
     Writeln;
     Writeln('Ma Tran A');
     For i := 1 To n Do
     Begin
          For j := 1 To n Do Write(a[i,j]:10:2);
          Writeln;
     End;
     d := 1;
     i := 1;
     ok2 := True;
     While ok2 And (i <= n) Do
     Begin
          If A[i,i] = 0 Then
          Begin
               ok1 := True;
               k := i + 1;
               While ok1 And (k <= n) Do
                    If a[k,i] <> 0 Then
                    Begin
                         For j := i To n Do
                         Begin
                              c := A[i,j];
                              A[i,j] := A[k,j];
                              A[k,j] := c;
                         End;
                         d := -d;
                         ok1 := False;
                    End
                    Else Inc(k);
                    If (k > n) Then
                    Begin
                         Writeln('MA TRAN SUY BIEN');
                         ok2 := False;
                         d := 0;
                    End;
          End;
          If A[i,i] <> 0 Then
          Begin
               c := A[i,i];
               For j := i + 1 To n Do A[i,j] := a[i,j]/c;
               For k := i + 1 To n Do
               Begin
                    c := A[k,i];
                    For j := i + 1 To n Do A[k,j] := A[k,j] - A[i,j] * c;
               End;
          End;
          Inc(i);
     End;
     If ok2 Then
     Begin
          For i := 1 To n Do d := d * A[i,i];
          Writeln;
          Writeln('Gia tri dinh thuc D = ',d:10:2);
     End;
     Readln;
End.
```

----------


## bluedragon0702

*Bài* *"MA TRẬN NGHỊCH ĐẢO"*



```
Program Ma_Tran_Nghich_Dao;
Uses Crt;
Var i, j, k, n : Integer;
    t, tl      : Boolean;
    c          : Real;
    a, b       : Array[1..50, 1..50] Of Real;

Begin
     Clrscr;
     Writeln(' ':25,'== MA TRAN NGHICH DAO ==');
     Write('Nhap so n = ');
     Readln(n);
     Writeln('Nhap Ma Tran ban dau A(',n:2,' so)');
     For i := 1 To n Do
     Begin
          Writeln('Nhap hang thu ',i,' : ');
          For j := 1 To n Do
          Begin
               Write('A[',i,',',j,'] = ');
               Read(A[i,j]);
          End;
          Writeln;
     End;
     For i := 1 To n Do
          For j := n + 1 To 2*n Do
              If j = i+n Then A[i,j] := 1 Else A[i,j] := 0;
     i := 1;
     tl := True;
     While tl And (i <= n) Do
     Begin
          If A[i,j] = 0 Then
          Begin
               t := True;
               k := i + 1;
               While t And (k <= n) Do
                    If A[k,i] <> 0 Then
                    Begin
                         For j := 1 To 2*n Do
                         Begin
                              c := A[i,j];
                              A[i,j] := A[k,j];
                              A[k,j] := c;
                         End;
                         t := False;
                    End
                    Else Inc(k);
               If k = n + 1 Then
               Begin
                    If A[i,k-1] = 0 Then
                    Begin
                         Writeln('MA TRAN SUY BIEN');
                         tl := False;
                    End;
               End;
          End;
          If A[i,i] <> 0 Then
          Begin
               c := A[i,i];
               For j := i To 2*n Do A[i,j] := A[i,j]/c;
          End;
          For k := 1 To n Do
          Begin
               If k <> i Then
               Begin
                    c := A[k,i];
                    For j := i To 2*n Do A[k,j] := A[k,j]-A[i,j]*c;
               End;
          End;
          Inc(i);
     End;
     If tl Then
     Begin
          Writeln;
          Writeln('MA TRAN KET QUA');
          Writeln;
          For i := 1 To n Do
          Begin
               For j := n + 1 To 2*n Do Write(A[i,j]:10:4);
               Writeln;
          End;
          Writeln;
     End;
     Readln;
End.
```

----------


## danghoaqt

> *Bài* *"NHÂN 2 MA TRẬN"*
> 
> 
> 
> ```
> 
> Program Nhan_Ma_Tran_Vuong 
> 
> 
> ...


Cái này cũng gọi là thuật giải Toán Cao cấp ak` bạn. Hjx

----------

