結果
問題 | No.295 hel__world |
ユーザー |
![]() |
提出日時 | 2015-10-23 23:32:03 |
言語 | C++11 (gcc 13.3.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,601 bytes |
コンパイル時間 | 1,242 ms |
コンパイル使用メモリ | 91,684 KB |
実行使用メモリ | 304,424 KB |
最終ジャッジ日時 | 2024-07-23 17:59:09 |
合計ジャッジ時間 | 16,385 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 19 WA * 34 |
ソースコード
#define _USE_MATH_DEFINES #include <algorithm> #include <cstdio> #include <functional> #include <iostream> #include <cfloat> #include <climits> #include <cstdlib> #include <cstring> #include <cmath> #include <map> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <time.h> #include <vector> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> i_i; typedef pair<ll, int> ll_i; typedef pair<double, int> d_i; typedef pair<ll, ll> ll_ll; typedef pair<double, double> d_d; struct edge { int u, v; ll w; }; ll MOD = 1000000007; ll _MOD = 1000000009; ll UNKO = 1LL<<62; double EPS = 1e-10; ll gcd(ll a, ll b) { if (b == 0) return abs(a); else return gcd(b, a % b); } ll mul(ll x, ll y) { double xy = (double)x * y; if (xy > UNKO * 1.9) return 0; return x * y; } ll c(ll n, ll k, vector<vector<ll> >& C) { if (n < 5000) return C[n][k]; if (k > n - k) k = n - k; if (k > 10) return 0; vector<ll> bunshi(k), bunbo(k); for (int i = 0; i < k; i++) { bunshi[i] = k - i; bunbo[i] = i + 1; } for (int i = 0; i < k; i++) for (int j = 0; j < k; j++) { ll d = gcd(bunshi[i], bunbo[j]); bunshi[i] /= d; bunbo[j] /= d; } ll ans = 1; for (int i = 0; i < k; i++) ans = mul(ans, bunshi[i]); return ans; } int main() { vector<vector<ll> > C(5000, vector<ll>(5000)); for (int i = 0; i < 5000; i++) { C[i][0] = 1; for (int j = 1; j <= i; j++) { if (!C[i - 1][j - 1] || (j <= i - 1 && !C[i - 1][j])) continue; C[i][j] = C[i - 1][j - 1] + C[i - 1][j]; if (C[i][j] >= UNKO) C[i][j] = 0; } } vector<ll> a(26); for (int k = 0; k < 26; k++) cin >> a[k]; vector<int> sum(26); vector<vector<int> > b(26, vector<int>(1000001)); string s; cin >> s; s.push_back(' '); char prev = 0; int x = 0; for (int i = 0; i < s.length(); i++) { char c = s[i]; if (c == prev) x++; else { if (prev) { sum[prev - 'a'] += x; b[prev - 'a'][x]++; } prev = c; x = 1; } } for (int k = 0; k < 26; k++) if (a[k] < sum[k]) { cout << 0 << endl; return 0; } ll ans = 1; for (int k = 0; k < 26; k++) { int ma = 0; for (int x = 1; x <= 1000000; x++) if (b[k][x]) ma = x; if (ma == 0) continue; // cout << (char)('a' + k) << ' ' << ma << endl; a[k] -= sum[k]; int num = b[k][ma]; for (int t = 0; t < a[k] % num; t++) ans = mul(ans, c(ma + a[k] / num + 1, ma, C)); for (int t = 0; t < num - a[k] % num; t++) ans = mul(ans, c(ma + a[k] / num, ma, C)); } if (ans == 0 || ans >= UNKO) cout << "hel" << endl; else cout << ans << endl; }