結果
| 問題 |
No.1785 Inequality Signs
|
| コンテスト | |
| ユーザー |
SSRS
|
| 提出日時 | 2021-12-14 00:06:46 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 121 ms / 2,000 ms |
| コード長 | 2,028 bytes |
| コンパイル時間 | 2,009 ms |
| コンパイル使用メモリ | 175,672 KB |
| 実行使用メモリ | 19,584 KB |
| 最終ジャッジ日時 | 2024-07-23 00:05:20 |
| 合計ジャッジ時間 | 6,739 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 52 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000007;
long long modpow(long long a, long long b){
long long ans = 1;
while (b > 0){
if (b % 2 == 1){
ans *= a;
ans %= MOD;
}
a *= a;
a %= MOD;
b /= 2;
}
return ans;
}
long long modinv(long long a){
return modpow(a, MOD - 2);
}
vector<long long> mf = {1};
vector<long long> mfi = {1};
long long modfact(int n){
if (mf.size() > n){
return mf[n];
} else {
for (int i = mf.size(); i <= n; i++){
long long next = mf.back() * i % MOD;
mf.push_back(next);
mfi.push_back(modinv(next));
}
return mf[n];
}
}
long long modfactinv(int n){
if (mfi.size() > n){
return mfi[n];
} else {
return modinv(modfact(n));
}
}
long long modbinom(int n, int k){
if (n < 0 || k < 0 || k > n){
return 0;
} else {
return modfact(n) * modfactinv(k) % MOD * modfactinv(n - k) % MOD;
}
}
template <typename T>
struct segment_tree{
int N;
vector<T> ST;
segment_tree(vector<T> A){
int n = A.size();
N = 1;
while (N < n){
N *= 2;
}
ST = vector<T>(N * 2 - 1, 1);
for (int i = 0; i < n; i++){
ST[N - 1 + i] = A[i];
}
for (int i = N - 2; i >= 0; i--){
ST[i] = ST[i * 2 + 1] * ST[i * 2 + 2] % MOD;
}
}
T operator [](int k){
return ST[N - 1 + k];
}
T range_product(int L, int R, int i, int l, int r){
if (R <= l || r <= L){
return 1;
} else if (L <= l && r <= R){
return ST[i];
} else {
int m = (l + r) / 2;
return range_product(L, R, i * 2 + 1, l, m) * range_product(L, R, i * 2 + 2, m, r) % MOD;;
}
}
T range_product(int L, int R){
return range_product(L, R, 0, 0, N);
}
};
int main(){
int N, K;
cin >> N >> K;
long long ans = 0;
//K+i, K+i-1, ..., K+i-N+1
//K-N+1~K+N-1
vector<long long> A(N * 2);
for (int i = 0; i < N * 2; i++){
A[i] = K - N + 1 + i;
}
segment_tree<long long> ST(A);
for (int i = 0; i <= N - 1; i++){
ans += modbinom(N - 1, i) * ST.range_product(i, i + N) % MOD * modfactinv(N) % MOD;
}
ans %= MOD;
cout << ans << endl;
}
SSRS