競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 269F

ABC269F

解法0

左上基準で長方形を調べる.

解法1

\(1\)-indexed で考える. 市松模様をさらに2種類に分ける. \(a,c\) の偶奇で場合分けしていくが, まずは簡単のため \(a,c\) が共に奇数の場合だけ考える.
等差数列の和の公式を使えばよい.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

int main() {
  ll n, m;
  cin >> n >> m;
  auto sum = [&](ll x, ll h, ll w) -> mint {
    return mint(h)*mint(w)*(mint(x) + mint(w-1)+mint(h-1)*mint(m));
  };


 
  ll q; cin >> q;
  rep(qi,q){
    ll a,b,c,d; cin >> a >> b >> c >> d;
    b++, d++;

    auto sum2 = [&](ll x, ll a, ll b, ll c, ll d) -> mint {
      return sum(x, ceil(b-a,2LL), ceil(d-c,2LL));
    };


    mint ans = 0;
    ll x = 0;
    if((a+c)%2 == 0){
      x = (a-1)*m + c;
      ans += sum2(x,a,b,c,d);

      x += m+1;
      a++; c++;
      ans += sum2(x,a,b,c,d);
    }else{
      x = (a-1)*m + c+1;
      c++;
      ans += sum2(x,a,b,c,d);

      a++; c--;
      x += m-1;
      ans += sum2(x,a,b,c,d);
    }

    cout << ans.val() << endl;
  }


  return 0;
}