답안 #1099023

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1099023 2024-10-10T12:25:05 Z ventusliberum Amusement Park (CEOI19_amusementpark) C++17
7 / 100
0 ms 348 KB
/**
 *    title:  Amusement Park
**/
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define si(x) int(x.size())
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define rep(i,n) for(int i = 0; i < (int)(n); i++)
#define rrep(i,n) for(int i = (int)(n) - 1; i >= 0; i--)
template <class T, class U> inline bool chmax(T &a, U b) { return (a < b ? a = b, 1 : 0); }
template <class T, class U> inline bool chmin(T &a, U b) { return (b < a ? a = b, 1 : 0); }
template <class T> istream &operator>>(istream &is, vector<T> &v) { for (auto &x : v) is >> x; return is; }
template <class T> ostream &operator<<(ostream &os, const vector<T> &v) { rep(i, si(v)) os << (i ? " " : "") << v[i]; return os; }
using ll = long long;
constexpr int inf = 1001001001;
constexpr long long infll = 4004004004004004004LL;

template <class T>
constexpr T power(T a, long long b) {
  T res = 1;
  while (b) {
    if (b & 1) res *= a;
    a *= a;
    b >>= 1;
  }
  return res;
}

template <int mod>
struct ModInt {
  int x;
  constexpr ModInt() : x{} {}
  constexpr ModInt(long long x) : x{norm(x % mod)} {}

  constexpr int norm(int x) const {
    if (x < 0) {
      x += mod;
    }
    if (x >= mod) {
      x -= mod;
    }
    return x;
  }
  constexpr int val() const {
    return x;
  }
  constexpr ModInt inv() const {
    assert(x != 0);
    return power(*this, mod - 2);
  }
  explicit constexpr operator int() const {
    return x;
  }
  constexpr ModInt operator-() const {
    ModInt res;
    res.x = norm(mod - x);
    return res;
  }
  constexpr ModInt& operator+=(ModInt rhs) {
    x = norm(x + rhs.x);
    return *this;
  }
  constexpr ModInt& operator-=(ModInt rhs) {
    x = norm(x - rhs.x);
    return *this;
  }
  constexpr ModInt& operator++() {
    return *this += 1;
  }
  constexpr ModInt& operator--() {
    return *this -= 1;
  }
  constexpr ModInt operator++(int) {
    ModInt res(*this);
    *this += 1;
    return res;
  }
  constexpr ModInt operator--(int) {
    ModInt res(*this);
    *this -= 1;
    return res;
  }
  constexpr ModInt& operator*=(ModInt rhs) {
    x = 1LL * x * rhs.x % mod;
    return *this;
  }
  constexpr ModInt& operator/=(ModInt rhs) {
    return *this *= rhs.inv();
  }
  friend constexpr ModInt operator+(ModInt lhs, ModInt rhs) {
    ModInt res = lhs;
    res += rhs;
    return res;
  }
  friend constexpr ModInt operator-(ModInt lhs, ModInt rhs) {
    ModInt res = lhs;
    res -= rhs;
    return res;
  }
  friend constexpr ModInt operator*(ModInt lhs, ModInt rhs) {
    ModInt res = lhs;
    res *= rhs;
    return res;
  }
  friend constexpr ModInt operator/(ModInt lhs, ModInt rhs) {
    ModInt res = lhs;
    res /= rhs;
    return res;
  }
  friend constexpr std::istream& operator>>(std::istream& is, ModInt& a) {
    long long v{};
    is >> v;
    a = ModInt(v);
    return is;
  }
  friend constexpr std::ostream& operator<<(std::ostream& os, const ModInt& a) {
    return os << a.val();
  }
  friend constexpr bool operator==(ModInt lhs, ModInt rhs) {
    return lhs.val() == rhs.val();
  }
  friend constexpr bool operator!=(ModInt lhs, ModInt rhs) {
    return lhs.val() != rhs.val();
  }
};

template <int num, int mod>
constexpr ModInt<mod> CInv = ModInt<mod>(num).inv();

constexpr int mod = 998244353;
using mint = ModInt<mod>;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);

  int n, m;
  cin >> n >> m;
  vector<vector<int>> edge(n, vector<int>(n));
  rep(_, m) {
    int a, b;
    cin >> a >> b;
    a--, b--;
    edge[a][b] = edge[b][a] = 1;
  }
  vector<int> popcount(1<<n);
  vector<int> independ(1<<n);
  for (int i = 1; i < (1<<n); i++) {
    popcount[i] = popcount[i>>1] + (i&1);
    int j = __builtin_ffs(i) - 1;
    independ[i] = 1;
    rep(k, n) {
      if ((i>>k&1) && edge[j][k]) independ[i] = 0;
    }
  }
  vector<mint> dp(1<<n);
  dp[0] = 1;
  for (int i = 1; i < (1<<n); i++) {
    for (int j = i; j; j = i&(j-1)) {
      if (independ[j]) {
        dp[i] += ((popcount[j] & 1) ? 1 : -1) * dp[i^j];
      }
    }
  }
  mint ans = dp[(1<<n)-1]/2*m;
  cout << ans << '\n';
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Incorrect 0 ms 348 KB Output isn't correct
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Incorrect 0 ms 348 KB Output isn't correct
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Incorrect 0 ms 348 KB Output isn't correct
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Incorrect 0 ms 348 KB Output isn't correct
10 Halted 0 ms 0 KB -