結果

問題 No.1596 Distance Sum in 2D Plane
ユーザー qLethonqLethon
提出日時 2021-07-09 22:16:30
言語 C++17
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 168 ms / 2,000 ms
コード長 4,712 bytes
コンパイル時間 2,051 ms
コンパイル使用メモリ 202,916 KB
実行使用メモリ 9,496 KB
最終ジャッジ日時 2023-09-14 09:30:10
合計ジャッジ時間 5,425 ms
ジャッジサーバーID
(参考情報)
judge12 / judge13
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 9 ms
9,472 KB
testcase_01 AC 9 ms
9,496 KB
testcase_02 AC 163 ms
9,316 KB
testcase_03 AC 164 ms
9,392 KB
testcase_04 AC 166 ms
9,312 KB
testcase_05 AC 168 ms
9,204 KB
testcase_06 AC 167 ms
9,420 KB
testcase_07 AC 168 ms
9,316 KB
testcase_08 AC 166 ms
9,144 KB
testcase_09 AC 165 ms
9,148 KB
testcase_10 AC 164 ms
9,148 KB
testcase_11 AC 141 ms
9,204 KB
testcase_12 AC 142 ms
9,256 KB
testcase_13 AC 141 ms
9,260 KB
testcase_14 AC 1 ms
4,376 KB
testcase_15 AC 2 ms
4,380 KB
testcase_16 AC 2 ms
4,376 KB
testcase_17 AC 1 ms
4,376 KB
testcase_18 AC 1 ms
4,376 KB
testcase_19 AC 1 ms
4,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

using namespace std;

template <std::uint_fast64_t Modulus> class modint {
    using u64 = std::uint_fast64_t;
    u64 a;

    public:

    template <class INT>
    constexpr modint(const INT x = 0) noexcept : a(x >= 0 ? x % Modulus : x % int_fast64_t(Modulus) + Modulus) {}
    constexpr modint(const u64 x = 0) noexcept : a(x % Modulus) {}
    constexpr u64 &value() noexcept { return a; }
    constexpr const u64 &value() const noexcept { return a; }
    constexpr modint operator+(const modint rhs) const noexcept {
        return modint(*this) += rhs;
    }
    constexpr modint operator-(const modint rhs) const noexcept {
        return modint(*this) -= rhs;
    }
    constexpr modint operator*(const modint rhs) const noexcept {
        return modint(*this) *= rhs;
    }
    constexpr modint operator/(const modint rhs) const noexcept {
        return modint(*this) /= rhs;
    }
    constexpr modint &operator+=(const modint rhs) noexcept {
        a += rhs.a;
        if (a >= Modulus) {
            a -= Modulus;
        }
        return *this;
    }
    constexpr modint &operator-=(const modint rhs) noexcept {
        if (a < rhs.a) {
            a += Modulus;
        }
        a -= rhs.a;
        return *this;
    }
    constexpr modint &operator*=(const modint rhs) noexcept {
        a = a * rhs.a % Modulus;
        return *this;
    }
    constexpr modint &operator/=(modint rhs) noexcept {
        u64 exp = Modulus - 2;
        while (exp) {
            if (exp % 2) {
                *this *= rhs;
            }
        rhs *= rhs;
        exp /= 2;
        }
        return *this;
    }

    constexpr bool operator<(const modint& rhs) const noexcept {return this->a < rhs.a;}
    constexpr bool operator>(const modint& rhs) const noexcept {return rhs < *this;}
    constexpr bool operator<=(const modint& rhs) const noexcept {return !(*this > rhs);}
    constexpr bool operator>=(const modint& rhs) const noexcept {return !(*this < rhs);}
    constexpr bool operator==(const modint& rhs) const noexcept {return this->a == rhs.a;}
    constexpr bool operator!=(const modint& rhs) const noexcept {return !(*this == rhs);}

    constexpr modint& operator++() noexcept {
        *this += modint(1);
        return *this;
    }
    constexpr modint operator++(int) noexcept {
        modint tmp(*this);
        ++(*this);
        return tmp;
    }
    constexpr modint& operator--() noexcept {
        *this -= modint(1);
        return *this;
    }
    constexpr modint operator--(int) noexcept {
        modint tmp(*this);
        --(*this);
        return tmp;
    }
    constexpr modint operator-() const noexcept {
        return modint(0) - *this;
    }

    template <std::uint_fast64_t M>
    friend constexpr std::ostream& operator<<(std::ostream& os, const modint<M>& rhs) noexcept {
        os << rhs.a;
        return os;
    }
    template <std::uint_fast64_t M>
    friend constexpr std::istream& operator>>(std::istream& is, modint<M>& rhs) noexcept {
        int64_t tmp;
        is >> tmp;
        rhs = modint(tmp);
        return is;
    }

    constexpr modint pow(const u64 k) const noexcept {
        if (k == 0)
            return 1;
        if (k % 2 == 0){
            modint res = pow(k / 2);
            return res * res;
        }
        return pow(k - 1) * modint(*this);
    }

    template <typename T>
    operator const T (){return a;}

};

const constexpr int64_t p = 1e9 + 7;
using mint = modint<p>;

template<class Modint>
class Binomial{
    vector<Modint> fact(uint64_t n){
        vector<Modint> f(n + 1);
        f[0] = 1;
        for (uint64_t i = 0; i < n; i++)
            f[i + 1] = Modint(i + 1) * f[i];
        return f;
    }

    vector<Modint> invfact(uint64_t n){
        vector<Modint> inv(n + 1);
        inv[n] = Modint(1) / f[n];
        for (uint64_t i = n; i > 0; i--)
            inv[i - 1] = inv[i] * i;
        return inv;
    }

public:
    vector<Modint> f, invf;

    Binomial(uint64_t n){
        f = fact(n);
        invf = invfact(n);
    }

    Modint binomial(int64_t a, int64_t b){
        if (a < b)
            return 0;
        if (a < 0 or b < 0)
            return 0;
        return f[a] * invf[b] * invf[a - b];
    }
};

int main(){
    int n;
    cin >> n;
    Binomial<mint> binom(2 * n);

    mint s = binom.binomial(2 * n, n) * 2 * n;

    int m;
    cin >> m;
    for (int i = 0; i < m; i++){
        int t, h, w;
        cin >> t >> h >> w;
        if (t == 1)
            s -= binom.binomial(h + w, h) * binom.binomial(n - (h + 1) + n - w, n - w);
        else
            s -= binom.binomial(h + w, h) * binom.binomial(n - h + n - (w + 1), n - h);
    }

    cout << s << endl;
}
0