解法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;
}