Submission #1282134

#TimeUsernameProblemLanguageResultExecution timeMemory
1282134quocbaooHexagonal Territory (APIO21_hexagon)C++20
0 / 100
1 ms576 KiB
#include "hexagon.h"
#include <bits/stdc++.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, std::vector<int> D, std::vector<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;
  a[0]=A;b[0]=B;
  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);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...