結果
| 問題 |
No.140 みんなで旅行
|
| コンテスト | |
| ユーザー |
mayoko_
|
| 提出日時 | 2015-01-30 13:36:10 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 34 ms / 5,000 ms |
| コード長 | 1,841 bytes |
| コンパイル時間 | 693 ms |
| コンパイル使用メモリ | 74,560 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-06-23 04:25:37 |
| 合計ジャッジ時間 | 1,620 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 19 |
ソースコード
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
#include <utility>
#include <set>
#include <cctype>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define INF 1000000000
using namespace std;
typedef long long ll;
const int MAXN = 600;
const ll MOD = 1000000007;
ll fact[MAXN];
ll dp[MAXN][MAXN];
void init() {
// fact
fact[0] = 1;
for (ll i = 1; i < MAXN; i++) {
fact[i] = (fact[i-1] * i) % MOD;
}
// dp
dp[0][0] = 1;
for (int i = 1; i < MAXN; i++) {
for (int j = 1; j <= i; j++) {
dp[i][j] = (dp[i-1][j-1] + (j * dp[i-1][j])%MOD) % MOD;
}
}
}
ll mod_pow(ll p, ll n, ll m = MOD) {
if (n == 0) return 1;
if (p == 0) return 0;
if (n == 1) return p % m;
if (n % 2 == 0) {
ll tmp = mod_pow(p, n/2, m);
return (tmp * tmp) % m;
} else {
ll tmp = mod_pow(p, n-1, m);
return (p * tmp) % m;
}
}
// extgcd
ll extgcd(ll a, ll b, ll& x, ll& y) {
ll d = a;
if (b != 0) {
d = extgcd(b, a % b, y, x);
y -= (a / b) * x;
} else {
x = 1; y = 0;
}
return d;
}
// mod_inverse
ll mod_inverse(ll a, ll m = MOD) {
ll x, y;
extgcd(a, m, x, y);
return (m+x%m) % m;
}
int main(void) {
init();
int N;
cin >> N;
ll ans = 0;
for (int i = 1; i <= N; i++) {
// i組作る
ll tmp = (fact[N] * mod_inverse(fact[N-i])) % MOD;
tmp = (tmp * mod_inverse(fact[i])) % MOD;
for (int j = 1; j <= i; j++) {
// jグループ作る
ll x = (tmp * dp[i][j]) % MOD;
x = (x * mod_pow(j*(j-1), N-i)) % MOD;
ans += x;
ans %= MOD;
}
}
cout << ans << endl;
return 0;
}
mayoko_