結果
| 問題 |
No.660 家を通り過ぎないランダムウォーク問題
|
| コンテスト | |
| ユーザー |
0x19f
|
| 提出日時 | 2018-03-03 12:57:22 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 91 ms / 2,000 ms |
| コード長 | 1,205 bytes |
| コンパイル時間 | 1,344 ms |
| コンパイル使用メモリ | 163,544 KB |
| 実行使用メモリ | 12,608 KB |
| 最終ジャッジ日時 | 2024-06-23 23:48:11 |
| 合計ジャッジ時間 | 3,302 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 45 |
ソースコード
#include <bits/stdc++.h>
#define REP(i, a, n) for(ll i = ((ll) a); i < ((ll) n); i++)
#define MOD 1000000007LL
using namespace std;
typedef long long ll;
class ModuloCombination {
private:
vector<ll> fact, inv_fact;
static ll modulo_power(ll a, ll n) {
if(n == 0) return 1;
if(n % 2 == 0) return modulo_power((a * a) % MOD, n / 2);
return (a * modulo_power(a, n - 1)) % MOD;
}
public:
ModuloCombination(ll N): fact(N + 1), inv_fact(N + 1) {
fact[0] = 1;
REP(i, 1, N + 1) fact[i] = (i * fact[i - 1]) % MOD;
REP(i, 0, N + 1) inv_fact[i] = modulo_power(fact[i], MOD - 2);
}
ll operator()(ll n, ll r) {
return fact[n] * inv_fact[r] % MOD * inv_fact[n - r] % MOD;
}
};
int main(void) {
ll N;
cin >> N;
ModuloCombination comb(N * 2);
vector<ll> catalan(N + 1);
catalan[0] = 1;
REP(i, 1, N + 1) catalan[i] = (comb(2 * i, i) - comb(2 * i, i - 1) + MOD) % MOD;
vector<ll> sum(N + 2, 0);
REP(i, 0, N + 1) sum[i + 1] = (sum[i] + catalan[i]) % MOD;
ll ans = 0;
REP(i, 0, N / 2 + 1) {
ll path = comb(N + i * 2, N + i);
ans = (ans + path) % MOD;
ans = (ans - (path * sum[N / 2 - i] * 2) % MOD + MOD) % MOD;
}
cout << ans << endl;
}
0x19f