#include<bits/stdc++.h>
using namespace std;
int n, m, countSolution = 0;
bool PrintSolution = false; // Tùy chọn có in phương án hay không
bool check(vector < int > a, int x, int y) {
// kiểm tra tất cả các quân đã đặt trong a có ăn quân đặt ở ô x, y
for (int i = 0; i < a.size(); i++) {
if ((a[i] != -1) && ((y == a[i]) || (i == x) || (i + a[i] == x + y) || (i - a[i] == x - y)))
return false;
}
return true;
}
void viewArr(vector <int> a) {
for (int i = 0; i < a.size(); i++)
cout << a[i] << " ";
cout << endl;
}
void sol(int k, vector < int > a) {
// điểm dừng
if (a.back() != -1) { // khi đã đặt đủ quân hậu --> mảng a được đánh dấu hết
if (PrintSolution) { // Tùy chọn có in phương án hay không
cout << "Found " << endl;
for (int i = 0; i < n; i++) cout << i << " " << a[i] << endl;
cout << "----------" << endl;
}
countSolution++; // Đếm số lượng phương án đã xác định được
return;
};
// Gọi đệ quy
for (int i = 0; i < m; i++) {
if (check(a, k, i)) { // kiểm tra xem đặt được vào cột i hay không
a[k] = i; // đặt thử lên cột i trên hàng k
sol(k + 1, a);
a[k] = -1; // hủy cách đặt tại cột i
}
}
return;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n>>m;
vector < int > a(n, -1); // Khởi tạo phương án trống
sol(0, a);
cout << countSolution;
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmludCBuLCBtLCBjb3VudFNvbHV0aW9uID0gMDsgCmJvb2wgUHJpbnRTb2x1dGlvbiA9IGZhbHNlOyAvLyBUw7l5IGNo4buNbiBjw7MgaW4gcGjGsMahbmcgw6FuIGhheSBraMO0bmcKYm9vbCBjaGVjayh2ZWN0b3IgPCBpbnQgPiBhLCBpbnQgeCwgaW50IHkpIHsKICAvLyBraeG7g20gdHJhIHThuqV0IGPhuqMgY8OhYyBxdcOibiDEkcOjIMSR4bq3dCB0cm9uZyBhIGPDsyDEg24gcXXDom4gxJHhurd0IOG7nyDDtCB4LCB5CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKSB7CiAgICBpZiAoKGFbaV0gIT0gLTEpICYmICgoeSA9PSBhW2ldKSB8fCAoaSA9PSB4KSB8fCAoaSArIGFbaV0gPT0geCArIHkpIHx8IChpIC0gYVtpXSA9PSB4IC0geSkpKQogICAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiB0cnVlOwp9CnZvaWQgdmlld0Fycih2ZWN0b3IgPGludD4gYSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKSAKICAgICAgICBjb3V0IDw8IGFbaV0gPDwgIiAiOwogICAgY291dCA8PCBlbmRsOwp9CnZvaWQgc29sKGludCBrLCB2ZWN0b3IgPCBpbnQgPiBhKSB7CiAgLy8gxJFp4buDbSBk4burbmcKICBpZiAoYS5iYWNrKCkgIT0gLTEpIHsgLy8ga2hpIMSRw6MgxJHhurd0IMSR4bunIHF1w6JuIGjhuq11IC0tPiBt4bqjbmcgYSDEkcaw4bujYyDEkcOhbmggZOG6pXUgaOG6v3QKICAgIGlmIChQcmludFNvbHV0aW9uKSB7IC8vIFTDuXkgY2jhu41uIGPDsyBpbiBwaMawxqFuZyDDoW4gaGF5IGtow7RuZwogICAgICBjb3V0IDw8ICJGb3VuZCAiIDw8IGVuZGw7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSBjb3V0IDw8IGkgPDwgIiAiIDw8IGFbaV0gPDwgZW5kbDsKICAgICAgY291dCA8PCAiLS0tLS0tLS0tLSIgPDwgZW5kbDsKICAgIH0KICAgIGNvdW50U29sdXRpb24rKzsgLy8gxJDhur9tIHPhu5EgbMaw4bujbmcgcGjGsMahbmcgw6FuIMSRw6MgeMOhYyDEkeG7i25oIMSRxrDhu6NjCiAgICByZXR1cm47CiAgfTsKICAvLyBH4buNaSDEkeG7hyBxdXkKICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewogICAgaWYgKGNoZWNrKGEsIGssIGkpKSB7IC8vIGtp4buDbSB0cmEgeGVtIMSR4bq3dCDEkcaw4bujYyB2w6BvIGPhu5l0IGkgaGF5IGtow7RuZwogICAgICBhW2tdID0gaTsgLy8gxJHhurd0IHRo4butIGzDqm4gY+G7mXQgaSB0csOqbiBow6BuZyBrCiAgICAgIHNvbChrICsgMSwgYSk7CiAgICAgIGFba10gPSAtMTsgLy8gaOG7p3kgY8OhY2ggxJHhurd0IHThuqFpIGPhu5l0IGkKICAgIH0KICB9CiAgcmV0dXJuOwp9CmludCBtYWluKCkgewogIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogIGNpbi50aWUoTlVMTCk7CiAgY291dC50aWUoTlVMTCk7CiAgY2luPj5uPj5tOwogIHZlY3RvciA8IGludCA+IGEobiwgLTEpOyAvLyBLaOG7n2kgdOG6oW8gcGjGsMahbmcgw6FuIHRy4buRbmcgCiAgc29sKDAsIGEpOwogIGNvdXQgPDwgY291bnRTb2x1dGlvbjsKICByZXR1cm4gMDsKfQ==