# [Solution] Mã hóa - Encryption ## Subtask 1 và 2: **Ý tưởng và cài đặt:** Ta trâu qua mọi $S$ mà $L ≤ S ≤ R$ và đếm số lượng thỏa yêu cầu đề bài Độ phức tạp: $O(R - L)$. ### Code mẫu: ```cpp= #include <bits/stdc++.h> using namespace std; // Function to count numbers between l and r such that a * s % k == 0 long long countMultiples(long long a, long long k, long long l, long long r) { int dem = 0; for(int i = l; i <= r; ++i) { if (a * i % k == 0) ++dem; } return dem; } int main() { freopen("ENCRYPTION.inp", "r", stdin); freopen("ENCRYPTION.out", "w", stdout); long long a, k, l, r; cin >> l >> r >> a >> k; long long result = countMultiples(a, k, l, r); cout << result; return 0; } ``` ## Subtask 3: **Ý tưởng:** - Đặt $P = LCM(A, K)$ - $A \times S$ $mod$ $k = 0$. Vậy $A \times S$ là bội của $P$. Khi đó, $A \times S$ sẽ có dạng $A \times S = x \times P$ với $x$ là số nguyên. $\Rightarrow A \times S = x \times \frac{A * K}{\gcd(A, K)}$ $\Rightarrow S = x \times \frac{K}{\gcd(A, K)}$ - Kết quả bài toán sẽ là số lượng $x$ sao cho $L ≤ x \times \frac{K}{\gcd(A, K)} ≤ R$, tương đương với số lượng số nguyên trong khoảng $[l, r]$ chia hết cho $K / \gcd(A, K)$. Độ phức tạp: $O(log (min(a, k)))$. ### Code mẫu: ```cpp= #include <bits/stdc++.h> using namespace std; long long countMultiples(long long a, long long k, long long l, long long r) { long long g = __gcd(a, k); g = k / g; return (r / g) - (l -1) / g; } int main() { freopen("ENCRYPTION.inp", "r", stdin); freopen("ENCRYPTION.out", "w", stdout); long long a, k, l, r; cin >> l >> r >> a >> k; long long result = countMultiples(a, k, l, r); cout << result << endl; return 0; } ```