๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ

  • $\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๋ถ€๋ถ„๋„ ๊ตฌ๊ฐ„ ๋ง์…ˆ, ์  ์ฟผ๋ฆฌ์ด๋ฏ€๋กœ ๊ทธ๋ƒฅ ์„ธ๊ทธ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ท€์ฐฎ์œผ๋‹ˆ๊นŒ ใ…‹ใ…‹

๐Ÿ’ป ํ’€์ด

  • ์ฝ”๋“œ (C++):

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';
        }
    }
}