存在
尝试简单推一下式子,显然对于奇数行,为
同时注意对于偶数的求和需要全部转为偶数,反之全部转为奇数。
同时也可以用简单的容斥思想,每次计算左上角为
同时整个过程中仅需 long long
即可,等差数列求和的除以 __int128_t
。
xxxxxxxxxx
841
2
3
4
5
6
7
8
9
10
11using namespace std;
12
13mt19937 rnd(random_device{}());
14int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
15bool rnddd(int x){return rndd(1, 100) <= x;}
16
17typedef unsigned int uint;
18typedef unsigned long long unll;
19typedef long long ll;
20typedef long double ld;
21
22
23
24template < typename T = int >
25inline T read(void);
26
27int N, M;
28
29ll QueryOdd(ll l, ll r){
30 if(!(l & 1))++l;
31 if(!(r & 1))--r;
32 if(l > r)return 0;
33 return (((l + r) * (((r - l) >> 1) + 1)) >> 1) % MOD;
34}
35ll QueryEven(ll l, ll r){
36 if(l & 1)++l;
37 if(r & 1)--r;
38 if(l > r)return 0;
39 return (((l + r) * (((r - l) >> 1) + 1)) >> 1) % MOD;
40}
41ll CntOdd(ll l, ll r){
42 if(!(l & 1))++l;
43 if(!(r & 1))--r;
44 if(l > r)return 0;
45 return (((r - l) >> 1) + 1) % MOD;
46}
47ll CntEven(ll l, ll r){
48 if(l & 1)++l;
49 if(r & 1)--r;
50 if(l > r)return 0;
51 return (((r - l) >> 1) + 1) % MOD;
52}
53
54int main(){
55 N = read(), M = read();
56 int Q = read();
57 while(Q--){
58 ll ans(0);
59 int a = read(), b = read(), c = read(), d = read();
60 (ans += QueryOdd(c, d) * CntOdd(a, b) % MOD) %= MOD;
61 (ans += ((QueryOdd(a, b) - CntOdd(a, b) + MOD) % MOD) * CntOdd(c, d) % MOD * M % MOD) %= MOD;
62 (ans += QueryEven(c, d) * CntEven(a, b) % MOD) %= MOD;
63 (ans += ((QueryEven(a, b) - CntEven(a, b) + MOD) % MOD) * CntEven(c, d) % MOD * M % MOD) %= MOD;
64 printf("%lld\n", ans);
65 }
66 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
67 return 0;
68}
69
70template < typename T >
71inline T read(void){
72 T ret(0);
73 int flag(1);
74 char c = getchar();
75 while(c != '-' && !isdigit(c))c = getchar();
76 if(c == '-')flag = -1, c = getchar();
77 while(isdigit(c)){
78 ret *= 10;
79 ret += int(c - '0');
80 c = getchar();
81 }
82 ret *= flag;
83 return ret;
84}
update-2023_01_25 初稿