結果
問題 | No.1596 Distance Sum in 2D Plane |
ユーザー | yamake |
提出日時 | 2021-07-09 21:52:53 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 455 ms / 2,000 ms |
コード長 | 2,068 bytes |
コンパイル時間 | 1,647 ms |
コンパイル使用メモリ | 172,528 KB |
実行使用メモリ | 9,856 KB |
最終ジャッジ日時 | 2024-07-01 16:09:41 |
合計ジャッジ時間 | 8,133 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 8 ms
7,372 KB |
testcase_01 | AC | 9 ms
7,504 KB |
testcase_02 | AC | 455 ms
9,848 KB |
testcase_03 | AC | 449 ms
9,852 KB |
testcase_04 | AC | 451 ms
9,852 KB |
testcase_05 | AC | 450 ms
9,724 KB |
testcase_06 | AC | 447 ms
9,724 KB |
testcase_07 | AC | 445 ms
9,852 KB |
testcase_08 | AC | 448 ms
9,852 KB |
testcase_09 | AC | 452 ms
9,724 KB |
testcase_10 | AC | 452 ms
9,852 KB |
testcase_11 | AC | 411 ms
9,724 KB |
testcase_12 | AC | 410 ms
9,856 KB |
testcase_13 | AC | 411 ms
9,852 KB |
testcase_14 | AC | 2 ms
5,376 KB |
testcase_15 | AC | 2 ms
5,376 KB |
testcase_16 | AC | 2 ms
5,376 KB |
testcase_17 | AC | 2 ms
5,376 KB |
testcase_18 | AC | 2 ms
5,376 KB |
testcase_19 | AC | 2 ms
5,376 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; #define rep(i,n) for(int i=0;i<n;++i) #define rep1(i,n) for(int i=1;i<=n;++i) #define debug(output) if(debugFlag)cout<<#output<<"= "<<output<<endl using lint = long long; typedef pair<int,int> P; const bool debugFlag=true; const lint linf=1e18+7; const lint inf=1e9+7; const int MOD=1000000007; struct Nums{ long long n; vector<long long> kaijo; Nums(int N){ n=N; kaijo.push_back(1); for(long long i=1;i<=n;i++){ kaijo.push_back((kaijo[i-1]*i)%MOD); } } long long myPow(long long x, long long n, long long m){ if(n == 0) return 1; if(n % 2 == 0) return myPow(x * x % m, n / 2, m); else return x * myPow(x, n - 1, m) % m; } long long modinv(long long a, long long m) { long long b = m, u = 1, v = 0; while (b) { long long t = a / b; a -= t * b; swap(a, b); u -= t * v; swap(u, v); } u %= m; if (u < 0) u += m; return u; } long long comb(long long N,long long K,long long rest){ if(N<0||K<0)return 0; if(N<K)return 0; long long res=kaijo[N]*modinv(kaijo[K],rest)%rest; res*=modinv(kaijo[N-K],rest); res%=rest; return res; } long long comb2(long long N,long long K,long long rest){ // O(K)で2項係数を返す if(N<0||K<0)return 0; if(N<K)return 0; long long res=modinv(kaijo[K],rest); for(long long i=0;i<K;++i){ res*=(N-i)%rest;res%=rest; } return res; } }; signed main(){ int n,m;cin>>n>>m; vector<int> t(m),x(m),y(m); rep(i,m)cin>>t[i]>>x[i]>>y[i]; Nums lib(n*2+10); lint res=lib.comb(2*n,n,MOD)*2*n%MOD; rep(i,m){ lint sub=lib.comb(x[i]+y[i],x[i],MOD); if(t[i]==1)sub*=lib.comb(2*n-x[i]-y[i]-1,n-x[i]-1,MOD); else sub*=lib.comb(2*n-x[i]-y[i]-1,n-y[i]-1,MOD); sub%=MOD; res+=MOD-sub; res%=MOD; } cout<<res<<"\n"; return 0; }