結果
| 問題 |
No.2522 Fall in love, Girls!
|
| コンテスト | |
| ユーザー |
MasKoaTS
|
| 提出日時 | 2023-08-28 16:08:22 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 64 ms / 2,000 ms |
| コード長 | 2,110 bytes |
| コンパイル時間 | 1,875 ms |
| コンパイル使用メモリ | 211,664 KB |
| 最終ジャッジ日時 | 2025-02-16 15:21:21 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 30 |
ソースコード
#include <bits/stdc++.h>
#define MOD 998244353ll
using namespace std;
using ll = long long;
ll nPk(ll n, ll k){
ll ret = 1;
for(ll i = n; i > n - k; --i){
ret *= i;
ret %= MOD;
}
return ret;
}
bool can_set_left(vector<vector<int> >& graph, ll s, int i, ll t){
for(int j = 0; j < t; ++j){
if(i == j || ((s >> j) & 1) == 0){
continue;
}
if(graph[j][i] == 1){
return false;
}
}
return true;
}
ll count_toposo(vector<vector<int> >& graph, vector<ll>& dp, ll s, ll t){
if(dp[s] == -1){
dp[s] = 0;
for(int i = 0; i < t; ++i){
if(((s >> i) & 1) == 0){
continue;
}
if(can_set_left(graph, s, i, t)){
dp[s] += count_toposo(graph, dp, s - (1 << i), t);
}
}
dp[s] %= MOD;
}
return dp[s];
}
int main(){
ll N, M, K; cin >> N >> M >> K;
vector<pair<int, int> > edges(K, pair<int, int>({}));
unordered_set<int> toposo_st = {};
for(auto& [x, y] : edges){
cin >> x >> y;
toposo_st.insert(--x);
toposo_st.insert(--y);
}
unordered_map<int, int> toposo_ids = {};
for(auto itr = toposo_st.begin(); itr != toposo_st.end(); ++itr){
toposo_ids[*itr] = toposo_ids.size();
}
ll t = toposo_ids.size();
vector<vector<int> > graph(t, vector<int>(t));
for(auto& [x, y] : edges){
graph[toposo_ids[x]][toposo_ids[y]] = 1;
}
vector<ll> dp(1 << t, -1);
dp[0] = 1;
ll ans = 0;
ll p1 = nPk(N - 1, N - t);
ll p2 = nPk(N - 1, N - t - 1);
for(int i = M; i < N; ++i){
if(toposo_st.find(i) != toposo_st.end()){
int id = toposo_ids[i];
if(!can_set_left(graph, (1 << t) - 1, id, t)){
continue;
}
ans += p1 * count_toposo(graph, dp, (1 << t) - 1 - (1 << id), t) % MOD;
}
else{
ans += p2 * count_toposo(graph, dp, (1 << t) - 1, t) % MOD;
}
}
ans %= MOD;
cout << ans << endl;
return 0;
}
MasKoaTS