---
# System prepended metadata

title: '[Solution] Mã hóa - Encryption'

---

# [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;
}
```