存在
尝试简单推一下式子,显然对于奇数行,为
同时注意对于偶数的求和需要全部转为偶数,反之全部转为奇数。
同时也可以用简单的容斥思想,每次计算左上角为
同时整个过程中仅需 long long 即可,等差数列求和的除以 __int128_t。
xxxxxxxxxx84123
45678910
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
2223
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 初稿