กำหนดอาร์เรย์ A ขนาด N ค่าเป็น 1,2,3 เท่านั้น สร้างเมทริกซ์ X โดย X[1][j] = A[j] และ X[i][j] = |X[i-1][j] - X[i-1][j+1]| สำหรับ i=2..N, j=1..N+1-i หา X[N][1] (ค่าสุดท้าย)
ตัวอย่าง: A=[1,2,3,1] ผลลัพธ์: 1
ขั้นตอนการแก้ปัญหา (Combinatorial / Lucas Theorem)
- แปลงปัญหา: คำนวณ
arr[i] = |A[i+1] - A[i]|(ขนาดN-1) - คำตอบขึ้นอยู่กับ parity ของ binomial coefficients: ใช้ฟังก์ชัน
calc(N,M)คำนวณC(N,M) mod 2(โดยนับเลข 1 ใน binary) - แยกกรณี
arr[i] == 1และarr[i] == 2คำนวณ XOR ตามสูตร - คืนค่า "1" หรือ "0"
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
int calc(int N, int M) {
int cnt = 0;
for (int k = N; k; k >>= 1) cnt += k >> 1;
for (int k = M; k; k >>= 1) cnt -= k >> 1;
for (int k = N - M; k; k >>= 1) cnt -= k >> 1;
return !cnt;
}
string solve(vector<int> A) {
int n = A.size();
vector<int> arr(n + 1);
for (int i = 1; i < n; i++) arr[i-1] = abs(A[i] - A[i-1]);
--n;
bool hh = 1, pd = 0, ck = 0;
for (int i = 0; i < n; i++) if (arr[i]) {
if (arr[i] == 1) hh = 0, pd ^= calc(n-1, i);
else ck ^= calc(n-1, i);
}
ck &= hh;
if (pd ^ ck) return "1" + hh;
return "0";
}
int main() {
vector<int> A = {1, 2, 3, 1};
cout << solve(A) << endl;
}
อินพุต / เอาต์พุต
Input: {1, 2, 3, 1}
Output: 1