Submission #374002
Source Code Expand
#include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <map> #include <queue> #include <set> #include <cassert> #include <cstdio> #include <bitset> using namespace std; typedef long long ll; const ll MD = 1e9+7; #define int long long ll comb[1000][1000]; void init() { comb[0][0] = 1; for (int i = 1; i < 1000; i++) { comb[i][0] = 1; for (int j = 1; j < 1000; j++) { comb[i][j] = comb[i-1][j] + comb[i-1][j-1]; comb[i][j] %= MD; } } } int P; int qs; int first[200]; int data[200]; int maxd[200]; ll ddfs(int p, int q) { if (p == P+1) { if (!q) return 1; return 0; } if (q < 0) return 0; ll res = 0; assert(0 <= data[p] && data[p] <= maxd[p]); if (data[p] == maxd[p]) { for (int i = maxd[p]-first[p]; i <= q; i++) { res += ddfs(p+1, q-i) * comb[q][i]; res %= MD; } return res; } assert(data[p] >= first[p]); int u = data[p] - first[p]; return comb[q][u]*ddfs(p+1, q-u) % MD; } ll calc() { return ddfs(1, qs); } int X; int dp[15][15]; int dfs(int p, int x) { int res = 0; if (p == P+1) { if (!x) return 1; return 0; } if (x < 0) return 0; assert(0 <= p && p < 15); assert(0 <= x && x < 15); if (dp[p][x] != -1) return dp[p][x]; for (int i = 0; i <= data[p]; i++) { res += dfs(p+1, x-p*i) * ((i == data[p] || i == 0) ? 1 : 2); res = min<int>(res, 2); } return dp[p][x] = res; } bool can() { memset(dp, -1, sizeof(dp)); return dfs(1, X) == 1; } ll mdfs(int p) { if (p == P+1) { if (!can()) return 0; // for (int i = 1; i <= P; i++) { // printf("%d ", data[i]); // } printf("endprint calc:%lld\n", calc()); return calc(); } ll res = 0; for (int i = first[p]; i <= maxd[p]; i++) { data[p] = i; res += mdfs(p+1); res %= MD; } return res; } signed main() { init(); int n; cin >> n >> X >> P; assert(1 <= n && n <= 50); assert(1 <= X && X <= 10); assert(1 <= P && P <= 10); for (int i = 1; i <= 15; i++) { maxd[i] = X/i+1; } for (int i = 0; i < n; i++) { string s; cin >> s; if (s == "?") { qs++; } else if (s.size() == 2) { first[10]++; } else { first[s[0] - '0']++; } } if (first[0]) { cout << 0 << endl; return 0; } for (int i = 1; i <= 15; i++) { first[i] = min(first[i], maxd[i]); } ll res = mdfs(1); cout << res << endl; return 0; }
Submission Info
Submission Time | |
---|---|
Task | G - 唯一の組み合わせ |
User | yosupo |
Language | C++11 (GCC 4.9.2) |
Score | 200 |
Code Size | 2839 Byte |
Status | AC |
Exec Time | 4905 ms |
Memory | 8728 KB |
Judge Result
Set Name | All | ||
---|---|---|---|
Score / Max Score | 200 / 200 | ||
Status |
|
Set Name | Test Cases |
---|---|
All | scrambled_00.txt, scrambled_01.txt, scrambled_02.txt, scrambled_03.txt, scrambled_04.txt, scrambled_05.txt, scrambled_06.txt, scrambled_07.txt, scrambled_08.txt, scrambled_09.txt, scrambled_10.txt, scrambled_11.txt, scrambled_12.txt, scrambled_13.txt, scrambled_14.txt, scrambled_15.txt, scrambled_16.txt, scrambled_17.txt, scrambled_18.txt, scrambled_19.txt, scrambled_20.txt, scrambled_21.txt, scrambled_22.txt, scrambled_23.txt, scrambled_24.txt, scrambled_25.txt, scrambled_26.txt, scrambled_27.txt |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
scrambled_00.txt | AC | 46 ms | 8688 KB |
scrambled_01.txt | AC | 44 ms | 8632 KB |
scrambled_02.txt | AC | 44 ms | 8660 KB |
scrambled_03.txt | AC | 44 ms | 8628 KB |
scrambled_04.txt | AC | 43 ms | 8628 KB |
scrambled_05.txt | AC | 43 ms | 8728 KB |
scrambled_06.txt | AC | 42 ms | 8616 KB |
scrambled_07.txt | AC | 43 ms | 8632 KB |
scrambled_08.txt | AC | 44 ms | 8632 KB |
scrambled_09.txt | AC | 45 ms | 8636 KB |
scrambled_10.txt | AC | 45 ms | 8672 KB |
scrambled_11.txt | AC | 69 ms | 8632 KB |
scrambled_12.txt | AC | 47 ms | 8632 KB |
scrambled_13.txt | AC | 44 ms | 8684 KB |
scrambled_14.txt | AC | 1570 ms | 8708 KB |
scrambled_15.txt | AC | 179 ms | 8600 KB |
scrambled_16.txt | AC | 170 ms | 8636 KB |
scrambled_17.txt | AC | 42 ms | 8628 KB |
scrambled_18.txt | AC | 42 ms | 8636 KB |
scrambled_19.txt | AC | 40 ms | 8636 KB |
scrambled_20.txt | AC | 40 ms | 8632 KB |
scrambled_21.txt | AC | 42 ms | 8628 KB |
scrambled_22.txt | AC | 43 ms | 8632 KB |
scrambled_23.txt | AC | 2039 ms | 8712 KB |
scrambled_24.txt | AC | 1821 ms | 8716 KB |
scrambled_25.txt | AC | 891 ms | 8724 KB |
scrambled_26.txt | AC | 622 ms | 8716 KB |
scrambled_27.txt | AC | 4905 ms | 8716 KB |