| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1282123 | quocbaoo | Hexagonal Territory (APIO21_hexagon) | C++20 | 0 ms | 0 KiB |
#include <hexagon.h>
#define ll long long
using namespace std;
const ll MOD = 1e9 + 7;
ll hx[6] = {-1, 0, 1, 1, 0, -1};
ll hy[6] = {1, 1, 0, -1, -1, 0};
ll modpow(ll u, ll v) {
ll s = 1;
while (v > 0) {
if (v & 1) s = (s * u) % MOD;
u = (u * u) % MOD;
v >>= 1;
}
return s;
}
int draw_territory(int N, int A, int B, int D[], int L[]) {
vector<ll> a(N + 1, 0), b(N + 1, 0);
ll po = modpow(2, MOD - 2); // nghịch đảo của 2 mod MOD
__int128 s = 0;
ll to = 0;
for (int i = 1; i <= N; i++) {
int dir = D[i - 1];
ll len = L[i - 1];
a[i] = a[i - 1] + hx[dir] * len;
b[i] = b[i - 1] + hy[dir] * len;
s += (__int128)(a[i - 1] - a[i]) * (__int128)(b[i - 1] + b[i]);
to = (to + len) % MOD;
}
s += (__int128)(a[N] - a[0]) * (__int128)(b[N] + b[0]);
if (s < 0) s = -s;
ll x = (ll)(s % MOD);
to = (to + 2) % MOD;
x = (x + MOD) % MOD;
return (int)(((x + to) * po) % MOD);
}
