Реши на с++
创建于:2025年10月24日
使用 GPT-5 Thinking 回答 Chat01
创建于:2025年10月24日
使用 GPT-5 Thinking 回答 Chat01
Вот аккуратное решение.
Идея: нумеруем друзей , фотографии — это векторы-столбцы (пустая колонка запрещена). Требуется посчитать число последовательностей из столбцов, где все суммарные вхождения по строкам одинаковы: для всех (какое-то ).
Сделаем включение–исключение по «пустым» столбцам. Пусть из столбцов ровно фиксируем пустыми. Тогда остаётся столбцов без запрета на пустоту. Число матриц с одинаковыми суммами строк равно
потому что для данного строки независимы (каждая выбирает позиций из ).
Тогда ответ
по модулю .
Остаётся посчитать биномиальные коэффициенты за через факториалы, а суммы — за .
cpp#include <bits/stdc++.h> using namespace std; const long long MOD = 998244353; long long mod_pow(long long a, long long e) { long long r = 1 % MOD; a %= MOD; while (e > 0) { if (e & 1) r = (r * a) % MOD; a = (a * a) % MOD; e >>= 1; } return r; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, k; if (!(cin >> n >> k)) return 0; // factorials up to k vector<long long> fact(k + 1), invfact(k + 1); fact[0] = 1; for (int i = 1; i <= k; ++i) fact[i] = fact[i - 1] * i % MOD; invfact[k] = mod_pow(fact[k], MOD - 2); for (int i = k; i > 0; --i) invfact[i - 1] = invfact[i] * i % MOD; auto C = [&](int n_, int r_) -> long long { if (r_ < 0 || r_ > n_) return 0LL; return fact[n_] * invfact[r_] % MOD * invfact[n_ - r_] % MOD; }; // Precompute B[m] = sum_{r=0}^m C(m,r)^n for m=0..k vector<long long> B(k + 1, 0); for (int m = 0; m <= k; ++m) { long long s = 0; for (int r = 0; r <= m; ++r) { long long comb = C(m, r); s += mod_pow(comb, n); if (s >= MOD) s -= MOD; } B[m] = s; } long long ans = 0; for (int s = 0; s <= k; ++s) { int m = k - s; long long term = C(k, s) * B[m] % MOD; if (s % 2 == 0) { ans += term; } else { ans -= term; } ans %= MOD; } if (ans < 0) ans += MOD; cout << ans % MOD << '\n'; return 0; }
Сложность: по времени (для нормально) и по памяти.