結果
| 問題 | No.1596 Distance Sum in 2D Plane |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-07-11 19:09:11 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 222 ms / 2,000 ms |
| コード長 | 4,575 bytes |
| 記録 | |
| コンパイル時間 | 1,590 ms |
| コンパイル使用メモリ | 167,656 KB |
| 実行使用メモリ | 6,784 KB |
| 最終ジャッジ日時 | 2024-07-02 03:11:09 |
| 合計ジャッジ時間 | 5,698 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 17 |
ソースコード
// 問題の URL を書いておく
//
#include <bits/stdc++.h>
using namespace std;
//#define ENABLE_PRINT
#if defined(ENABLE_PRINT)
#define Print(v) \
do {\
cerr << #v << ": " << v << endl; \
}while(0)
#define PrintVec(v) \
do {\
for(int __i = 0; __i < v.size(); ++__i) \
{ \
cerr << #v << "[" << __i << "]: " << v[__i] << endl; \
}\
}while(0)
#define P(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__)
#define LP fprintf(stderr, "L: %d\n", __LINE__)
#else
#define Print(v) ((void)0)
#define PrintVec(v) ((void)0)
#define P(fmt, ...) ((void)0)
#define LP ((void)0)
#endif
#define rep(i, n) for(int i = 0; i < (int)(n); ++i)
using ll = long long;
namespace internal {
struct modint_base {};
struct static_modint_base : modint_base {};
template <class T> using is_modint = std::is_base_of<modint_base, T>;
template <class T> using is_modint_t = std::enable_if_t<is_modint<T>::value>;
} // namespace internal
template <int m, std::enable_if_t<(1 <= m)>* = nullptr>
struct static_modint : internal::static_modint_base {
using mint = static_modint;
public:
static constexpr int mod() { return m; }
static mint raw(int v) {
mint x;
x._v = v;
return x;
}
static_modint() : _v(0) {}
static_modint(int v) {
long long x = (long long)(v % (long long)(umod()));
if (x < 0) x += umod();
_v = (unsigned int)(x);
}
static_modint(bool v) { _v = ((unsigned int)(v) % umod()); }
unsigned int val() const { return _v; }
mint& operator++() {
_v++;
if (_v == umod()) _v = 0;
return *this;
}
mint& operator--() {
if (_v == 0) _v = umod();
_v--;
return *this;
}
mint operator++(int) {
mint result = *this;
++*this;
return result;
}
mint operator--(int) {
mint result = *this;
--*this;
return result;
}
mint& operator+=(const mint& rhs) {
_v += rhs._v;
if (_v >= umod()) _v -= umod();
return *this;
}
mint& operator-=(const mint& rhs) {
_v -= rhs._v;
if (_v >= umod()) _v += umod();
return *this;
}
mint& operator*=(const mint& rhs) {
unsigned long long z = _v;
z *= rhs._v;
_v = (unsigned int)(z % umod());
return *this;
}
mint& operator/=(const mint& rhs) { return *this = *this * rhs.inv(); }
mint operator+() const { return *this; }
mint operator-() const { return mint() - *this; }
mint pow(long long n) const {
assert(0 <= n);
mint x = *this, r = 1;
while (n) {
if (n & 1) r *= x;
x *= x;
n >>= 1;
}
return r;
}
mint inv() const {
if (prime) {
assert(_v);
return pow(umod() - 2);
} else {
abort();
}
}
friend mint operator+(const mint& lhs, const mint& rhs) {
return mint(lhs) += rhs;
}
friend mint operator-(const mint& lhs, const mint& rhs) {
return mint(lhs) -= rhs;
}
friend mint operator*(const mint& lhs, const mint& rhs) {
return mint(lhs) *= rhs;
}
friend mint operator/(const mint& lhs, const mint& rhs) {
return mint(lhs) /= rhs;
}
friend bool operator==(const mint& lhs, const mint& rhs) {
return lhs._v == rhs._v;
}
friend bool operator!=(const mint& lhs, const mint& rhs) {
return lhs._v != rhs._v;
}
private:
unsigned int _v;
static constexpr unsigned int umod() { return m; }
static constexpr bool prime = true;
};
using modint1000000007 = static_modint<1000000007>;
using mint = modint1000000007;
const int NMax = 200005 * 2;
mint facts[NMax];
mint invs[NMax];
mint comb(int n, int m)
{
return invs[m] * facts[n] * invs[n - m];
}
void setup()
{
facts[0] = 1;
invs[0] = 1;
rep(i, NMax - 1)
{
facts[i + 1] = facts[i] * (i + 1);
invs[i + 1] = facts[i + 1].inv();
}
}
int main(int, const char**)
{
setup();
int N, M;
cin >> N >> M;
auto ans = comb(2 * N, N) * N * 2;
rep(i, M)
{
int t, x, y;
cin >> t >> x >> y;
auto d0 = comb(x + y, x);
if(t == 1)
{
auto d1 = comb((N - (x + 1)) + (N - y), (N - y));
ans -= d0 * d1;
}
else
{
auto d1 = comb((N - x) + (N - (y + 1)), (N - x));
ans -= d0 * d1;
}
}
cout << ans.val() << endl;
return 0;
}