QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#602104#990. Colorful ComponentsMade_in_CodeRE 0ms3688kbC++142.4kb2024-09-30 19:36:312024-09-30 19:36:35

Judging History

你现在查看的是最新测评结果

  • [2024-09-30 19:36:35]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:3688kb
  • [2024-09-30 19:36:31]
  • 提交

answer

#include <iostream>
#define LL long long

using namespace std;

const int kMaxN = 301, kMod = 1e9 + 7;
// const int kMaxN = 5, kMod = 1e9 + 7;
int n, m, p, a[kMaxN];
LL ans, pw[kMaxN], f[kMaxN][kMaxN], g[kMaxN][kMaxN], h[kMaxN][kMaxN];
LL fact[kMaxN], _fact[kMaxN];

LL Pow(LL x, int y = kMod - 2) {
  LL ans = 1;
  y = (y + kMod - 1) % (kMod - 1);
  for (int i = 1; i <= y; i <<= 1) {
    if (i & y) {
      ans = ans * x % kMod;
    }
    x = x * x % kMod;
  }
  return ans;
}

LL C(int x, int y) { return fact[x] * _fact[y] % kMod * _fact[x - y] % kMod; }

void Add(LL &x, LL y) { x = (x + y) % kMod; }

int main() {
  cin.tie(0), cout.tie(0);
  ios::sync_with_stdio(0);
  fact[0] = 1;
  for (int i = 1; i < kMaxN; i++) {
    fact[i] = fact[i - 1] * i % kMod;
  }
  _fact[kMaxN - 1] = Pow(fact[kMaxN - 1]);
  for (int i = kMaxN - 1; i >= 1; i--) {
    _fact[i - 1] = _fact[i] * i % kMod;
  }
  cin >> n >> m;
  for (int i = 1, x; i <= n; i++) {
    cin >> x, a[x]++;
  }
  for (int i = 1; i <= m; i++) {
    pw[i] = Pow(i, i - 1);
  }
  f[0][0] = 1;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j <= i; j++) {
      for (int k = 1; k <= m; k++) {
        Add(f[i + k][j + 1], f[i][j] * C(i + k - 1, i) % kMod * pw[k]);
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      f[i][j] = f[i][j] * Pow(i, j - 2) % kMod;
      // cout << f[i][j] << " \n"[j == n];
    }
  }
  // cout << '\n';
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      Add(g[i][1], j & 1 ? f[i][j] : kMod - f[i][j]);
    }
    g[i][1] = g[i][1] * i % kMod;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j + i <= n; j++) {
      for (int k = 1; k < n; k++) {
        Add(g[j + i][k + 1], g[j][k] * g[i][1]);
      }
    }
  }
  // for (int i = 1; i <= n; i++) {
  //   for (int j = 1; j <= n; j++) {
  //     cout << g[i][j] << " \n"[j == n];
  //   }
  // }
  // cout << '\n';
  h[0][0] = 1;
  for (int i = 1; i <= n; i++) {
    if (a[i]) {
      for (int j = 1; j <= a[i]; j++) {
        for (int k = 0; k <= n - j; k++) {
          Add(h[i][k + j], h[p][k] * g[a[i]][j]);
        }
        g[a[i]][j];
      }
      p = i;
    }
  }
  for (int i = 1; i <= n; i++) {
    h[p][i] = h[p][i] * Pow(n, i - 2) % kMod;
    Add(ans, h[p][i]);
  }
  cout << ans << '\n';
  return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 3688kb

input:

5 3
1
1
3
1
5

output:

125

result:

ok "125"

Test #2:

score: 0
Accepted
time: 0ms
memory: 3600kb

input:

4 2
2
1
1
1

output:

7

result:

ok "7"

Test #3:

score: -100
Runtime Error

input:

300 16
2
2
2
4
5
1
5
3
5
4
2
1
4
4
4
5
2
1
5
4
3
4
5
3
5
5
1
3
1
1
2
5
5
3
3
2
5
2
3
2
2
4
2
2
2
4
4
2
2
4
1
3
3
4
1
3
3
4
3
4
3
5
5
4
3
3
1
2
1
2
5
2
2
4
3
3
5
3
2
4
3
5
1
4
5
5
2
3
2
3
4
4
5
5
5
5
4
5
3
2
4
4
4
3
5
3
1
1
3
5
5
4
5
2
5
5
5
2
2
2
3
1
5
4
1
4
3
5
1
4
4
2
5
2
2
4
5
3
4
3
3
4
2
5
1
1
3...

output:


result: