๐ ๋ฌธ์ ์ ๋ณด
๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ
- $\text{gcd}(n, n+1)$์ ๋ช์ผ๊น?
- $G = gcd(n, n+1)$์ด ์ด๋ค ์์ $p$๋ฅผ ์ฝ์๋ก ๊ฐ์ง๋ค๊ณ ํ์.
- ์ด๋ $p$๋ ๊ฐ๊ฒฉ $p$๋ง๋ค ํ๊ฐ์ฉ ์กด์ฌํ๋ค.
- $p = 2$๋ฉด $p$๋ฅผ ์ฝ์๋ก ๊ฐ์ง ์๋ $2$์นธ๋ง๋ค ์กด์ฌํ๋ค.
- ๋ฐ๋ผ์ ์ฐ์๋ ๋ ์๋ ์ด๋ค ๊ณต์ฝ์์ธ ์์ $p$๋ฅผ ๊ฐ์ง ์ ์๋ค!
- ๋ฐ๋ผ์ $\text{gcd}(n, n+1) = 1$์์ ์ ์ ์๋ค.
- ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก, $\text{gcd}(a, b) = \text{gcd}(a, b-a)$ ์๋ ์ ์ ์๋ค.
- ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์์๋ ์ ์ ์๋ฏ์ด!
- ๊ตฌ๊ฐ ์ฟผ๋ฆฌ์ง๋ง, Lazyํ๊ฒ ์ฐ์ฐํ๊ธฐ๋ ์ฝ์ง ์์๋ณด์ธ๋ค.
- ํ์ง๋ง $\text{gcd}(x_a, x_{a+1}, x_{a+2}, \dots, x_b)$ ๋ฅผ
- $\text{gcd}(x_a, x_{a+2} - x_{a+1}, x_{a+3} - x_{a+2}, \dots, x_b - x_{b-1})$
- ์ด๋ผ๊ณ ์๊ฐํ๋ฉด, ๋ฐ๋๋ ์๋ ์๊ฐ๋ณด๋ค ๋ง์ง ์๋ค!
- Lazyํ ํฉ ์ฐ์ฐ๊ณผ ์ต๋๊ณต์ฝ์์ ๋ํ ๊ทธ๋ฅ ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ๋ก ํ ์ ์์ง ์์๊น?
- ์ฌ์ค Lazy๋ถ๋ถ๋ ๊ตฌ๊ฐ ๋ง์
, ์ ์ฟผ๋ฆฌ์ด๋ฏ๋ก ๊ทธ๋ฅ ์ธ๊ทธ๋ก ๋ฐ๊ฟ ์ ์์ง๋ง, ๊ท์ฐฎ์ผ๋๊น ใ
ใ
๐ป ํ์ด
void solve(){
int N; cin >> N;
LazySegmentTree LST(N);
ST.init(N-1);
vector<ll> A(N);
rep(i, 0, N) cin >> A[i];
rep(i, 0, N) LST.set(i, A[i]);
LST.build();
rep(i, 0, N-1) ST.set(i, abs(A[i+1] - A[i]));
ST.build();
int Q; cin >> Q;
while(Q--){
ll op, a, b; cin >> op >> a >> b;
a--; b--;
if(op){
LST.update(a, b, op);
if(a-1 >= 0) ST.update(a-1, abs(LST.query(a-1, a-1) - LST.query(a, a)));
if(a+1 < N) ST.update(a, abs(LST.query(a+1, a+1) - LST.query(a, a)));
}else{
cout << gcd(LST.query(a, a), ST.query(a, b-1)) << '\n';
}
}
}