# Bội chung của dãy
YugiHacker có một dãy số nguyên dương $n$ phần tử và $q$ truy vấn, mỗi truy vấn YugiHacker sẽ chọn ra một phần tử và nhân nó lên một lượng là $x$, hãy tính Bội chung nhỏ nhất của dãy sau khi thực hiện mỗi truy vấn này.
Vì kết quả có thể rất lớn, bạn hãy in ra kết quả sau khi MOD $10^9 + 7$
# Input
Dòng đầu là số $2$ nguyên dương $n, q$ ($1 \le n, q \le 10^5$)
Dòng tiếp theo là $n$ số nguyên dương $a_i$ ($1 \le a_i \le 10^5$)
$q$ dòng tiếp theo, mỗi dòng là $2$ số nguyên $i, x$ ($1 \le i \le n$, $1 \le x \le 10^5$)
# Output
Với mỗi truy vấn, in ra kết quả trên một dòng
# Subtask
- Subtask 1: $q \le 10$
- Subtask 2: $a_i, x$ chỉ chia hết cho $2, 3 \text{ hoặc } 5$
- Subtask 3: Không giới hạn gì thêm
# Sample
- Input
```
5 3
1 2 3 4 5
2 2
1 7
5 18
```
- Output
```
60
420
1260
```
# Hướng dẫn giải
Xét nhân tử nguyên tố $p$, thì số mũ của $p$ trong Bội chung của dãy sẽ là số mũ lớn nhất của $p$ khi phân tích các $a_i$ thành thừa số nguyên tố.
Vậy với mỗi lần nhân $x$ vào vị trí $a_i$, ta cần kiểm tra các nhân tử $p$ của $x$, khi nhân $x$ vào $a_i$ có khiến số mũ lớn nhất đó thay đổi không, nếu có ta sẽ nhân Bội chung lên một lượng tương ứng
Số nhân tử khi phân tích một số $x$ thành thừa số nguyên tố sẽ không vượt quá $log(x)$
Độ phức tạp : $O(AloglogA + (n+q)logA)$ với $A$ là giá trị tối đa của $a_i, x$
# Code Solution
```cpp
/*
www.youtube.com/YugiHackerChannel
oj.vnoi.info/user/YugiHackerKhongCopCode
*/
#include<bits/stdc++.h>
#define el cout<<"\n"
#define f0(i,n) for(int i=0;i<n;++i)
#define f1(i,n) for(int i=1;i<=n;++i)
#define maxn 100005
#define MOD 1000000007
using namespace std;
int n, q, a[maxn], d[maxn], ma[maxn];
map <int, int> cnt[maxn];
long long ans = 1;
main()
{
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
for (int i=2; i*i<maxn; ++i)
for (int j=i*i; j<maxn; j+=i) if (d[j] == 0) d[j] = i;
for (int i=2; i<maxn; ++i) if (d[i] == 0) d[i] = i;
cin >> n >> q;
f1 (i, n)
{
cin >> a[i];
while (a[i] > 1)
{
int k = d[a[i]];
int cur = 0;
while (a[i] % k == 0) cur++, a[i]/=k;
cnt[i][k] += cur;
if (cnt[i][k] > ma[k])
{
f1 (_, cnt[i][k]-ma[k]) (ans *= k) %= MOD;
ma[k] = max(ma[k], cur);
}
}
}
while (q--)
{
int i, val; cin >> i >> val;
while (val > 1)
{
int k = d[val];
int cur = 0;
while (val % k == 0) cur++, val /= k;
cnt[i][k] += cur;
if (cnt[i][k] > ma[k])
{
f1 (_, cnt[i][k]-ma[k]) (ans *= k) %= MOD;
ma[k] = max(ma[k], cnt[i][k]);
}
}
cout << ans; el;
}
}
```