結果
問題 | No.2711 Connecting Lights |
ユーザー | yasunori |
提出日時 | 2024-03-31 14:06:03 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 146 ms / 5,000 ms |
コード長 | 6,261 bytes |
コンパイル時間 | 2,162 ms |
コンパイル使用メモリ | 217,464 KB |
実行使用メモリ | 14,080 KB |
最終ジャッジ日時 | 2024-09-30 18:56:57 |
合計ジャッジ時間 | 3,736 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,820 KB |
testcase_01 | AC | 2 ms
6,820 KB |
testcase_02 | AC | 2 ms
6,820 KB |
testcase_03 | AC | 1 ms
6,816 KB |
testcase_04 | AC | 2 ms
6,824 KB |
testcase_05 | AC | 4 ms
6,816 KB |
testcase_06 | AC | 2 ms
6,816 KB |
testcase_07 | AC | 2 ms
6,816 KB |
testcase_08 | AC | 2 ms
6,816 KB |
testcase_09 | AC | 85 ms
9,704 KB |
testcase_10 | AC | 15 ms
8,448 KB |
testcase_11 | AC | 29 ms
12,288 KB |
testcase_12 | AC | 15 ms
7,816 KB |
testcase_13 | AC | 12 ms
8,832 KB |
testcase_14 | AC | 3 ms
6,820 KB |
testcase_15 | AC | 18 ms
6,820 KB |
testcase_16 | AC | 4 ms
6,820 KB |
testcase_17 | AC | 4 ms
6,820 KB |
testcase_18 | AC | 4 ms
6,820 KB |
testcase_19 | AC | 21 ms
10,388 KB |
testcase_20 | AC | 19 ms
9,088 KB |
testcase_21 | AC | 4 ms
6,816 KB |
testcase_22 | AC | 2 ms
6,816 KB |
testcase_23 | AC | 3 ms
6,816 KB |
testcase_24 | AC | 37 ms
7,376 KB |
testcase_25 | AC | 66 ms
8,180 KB |
testcase_26 | AC | 146 ms
14,080 KB |
testcase_27 | AC | 48 ms
13,952 KB |
testcase_28 | AC | 146 ms
13,952 KB |
testcase_29 | AC | 32 ms
14,080 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; template <typename T> using min_priority_queue = priority_queue<T,vector<T>,greater<T>>; template<typename T> void printv(vector<T> &v){ bool b = false; for(auto i : v){ if(b) cout << " "; else b = true; cout << i; } cout << endl; } template <typename T> bool chmin(T &a, const T& b) { if (a > b) { a = b; // aをbで更新 return true; } return false; } template <typename T> bool chmax(T &a, const T& b) { if (a < b) { a = b; // aをbで更新 return true; } return false; } template <typename T> T exEuclid(T a, T b, T &x, T &y){ T d = a; if(b != 0){ d = exEuclid(b, a%b, y, x); y -= (a/b)*x; } else{ x = 1; y = 0; } //cout << a << " * " << x << " + " << b << " * " << y << " = " << d << endl; return d; } int64_t mod; struct modint{ int64_t n; int64_t p; modint(){ n = 0; p = mod; } modint(int64_t a){ if(a <= -mod) a %= mod; else if(a >= mod) a %= mod; if(a < 0) a += mod; n = a; p = mod; } modint(int64_t a, int64_t q){ if(a <= -q) a %= q; else if(a >= q) a %= q; if(a < 0) a += q; n = a; p = q; } modint pow(int64_t a){ if(a <= 1-p) a %= p-1; else if(a >= p-1) a %= p-1; if(a < 0) a += p-1; modint rtn; if(n == 0) { rtn.n = 0; return rtn; } if(n == 1) { rtn.n = 1; return rtn; } if(a == 0) { rtn.n = 1; return rtn; } if(a == 1) { rtn.n = n; return rtn; } int64_t b = a/2; int64_t c = a%2; rtn = pow(b); rtn *= rtn; if(c){ rtn *= modint(n); } return rtn; } bool operator==(modint other){ return n == other.n && p == other.p; } bool operator!=(modint other){ return !(n == other.n && p == other.p); } modint operator+(modint other){ modint rtn(n+other.n, p); return rtn; } modint operator-(modint other){ modint rtn(n-other.n, p); return rtn; } modint operator*(modint other){ modint rtn(n*other.n, p); return rtn; } modint operator/(modint other){ int64_t x, y, d; d = exEuclid(other.n, p, x, y); int64_t rtn = x*n; if(d > 1) rtn /= d; return modint(rtn); } void operator+=(modint other){ n += other.n; if(n >= p) n %= p; } void operator-=(modint other){ n -= other.n; if(n < 0) n += p; } void operator*=(modint other){ n *= other.n; if(n >= p) n %= p; } void operator/=(modint other){ int64_t x, y, d; d = exEuclid(other.n, p, x, y); n *= x; if(d > 1) n /= d; if(n <= p || p <= n) n %= p; if(n < 0) n += p; return; } void operator++(){ n++; if(n == p) n = 0; return; } void operator--(){ n--; if(n == -1) n = p-1; return; } }; vector<modint> fact_mod_v; vector<modint> inv_fact_mod_v; modint comb_mod(int64_t n, int64_t m){ if(n < 0 || m < 0 || m > n) return 0; modint rtn = fact_mod_v[n]*inv_fact_mod_v[m]*inv_fact_mod_v[n-m]; return rtn; } modint comb_mod_small(int64_t n, int64_t m){ if(m < mod){ return comb_mod(n%mod, m); } return comb_mod_small(n/mod, m/mod)*comb_mod(n%mod, m%mod); } void init_fact(int64_t n){ fact_mod_v.resize(n+1,0); inv_fact_mod_v.resize(n+1,0); for(int64_t i = 0; i <= n; i++){ if(i == 0){ fact_mod_v[i] = modint(1); } else{ fact_mod_v[i] = modint(i*fact_mod_v[i-1].n); } //cout << i << endl; } for(int64_t i = min(n, mod-1); i >= 0; i--){ if(i == min(n, mod-1)){ inv_fact_mod_v[i] = modint(fact_mod_v[i]).pow(-1); } else{ inv_fact_mod_v[i] = modint(inv_fact_mod_v[i+1].n*(i+1)); } //cout << i << endl; } } void yn(bool b){ if(b) cout << "Yes" << endl; else cout << "No" << endl; } bool debug; bool randomInput; bool debugOutput; int numOfTestCase; using ans_type = int; void input(){ if(numOfTestCase > 1){ ; } if(randomInput){ } else{ } return; } void output_input(){ ; } ans_type calc(){ mod = 998244353; int N, M, K; cin >> N >> M >> K; vector<vector<bool>> V(1<<N, vector<bool>(1<<N, false)); for(int i = 0; i < (1<<N); i++){ for(int j = 0; j < (1<<N); j++){ int cnt = 0; for(int k = 0; k < N; k++){ if((i>>k&1) && (j>>k&1)) cnt++; } if(cnt >= K) V[i][j] = true; } } vector<vector<modint>> dp(M, vector<modint>(1<<N, 0)); for(int j = 0; j < (1<<N); j++) dp[0][j] = 1; for(int i = 0; i < M-1; i++){ for(int j = 0; j < (1<<N); j++){ for(int k = 0; k < (1<<N); k++){ if(V[j][k]) dp[i+1][k] += dp[i][j]; } } } modint ans(0); for(int j = 0; j < (1<<N); j++){ ans += dp[M-1][j]; } cout << ans.n << endl; return ans_type(); } ans_type calc_simple(){ return ans_type(); } void output(ans_type ans){ return; } int main(){ debug = 0; randomInput = 0; debugOutput = 0; numOfTestCase = 1; srand(time(NULL)); cout << fixed << setprecision(12); if(numOfTestCase == 0) cin >> numOfTestCase; if(debug){ for(int i = 0; i < numOfTestCase; i++){ input(); ans_type ans = calc(); ans_type ansSimple = calc_simple(); if(ans != ansSimple){ output_input(); output(ans); output(ansSimple); } } } else{ for(int i = 0; i < numOfTestCase; i++){ input(); output(calc()); } } return 0; }