Advertisement
pb_jiang

ARC077B AC

Dec 1st, 2022
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.66 KB | None | 0 0
  1. // Problem: D - 11
  2. // Contest: AtCoder - AtCoder Beginner Contest 066
  3. // URL: https://atcoder.jp/contests/abc066/tasks/arc077_b
  4. // Memory Limit: 256 MB
  5. // Time Limit: 2000 ms
  6. //
  7. // Powered by CP Editor (https://cpeditor.org)
  8.  
  9. #include <assert.h>
  10. #include <bits/stdc++.h>
  11. #include <atcoder/modint>
  12. using namespace std;
  13. #define dbg(...) logger(#__VA_ARGS__, __VA_ARGS__)
  14. template <typename... Args> void logger(string vars, Args &&... values)
  15. {
  16.     cerr << vars << " = ";
  17.     string delim = "";
  18.     (..., (cerr << delim << values, delim = ", "));
  19.     cerr << endl;
  20. }
  21.  
  22. template <class T> inline auto vv(int m) { return vector<vector<T>>(m, vector<T>(m)); }
  23. template <class T> inline auto vv(int m, int n) { return vector<vector<T>>(m, vector<T>(n)); }
  24. template <class T, T init> inline auto vv(int m) { return vector<vector<T>>(m, vector<T>(m, init)); }
  25. template <class T, T init> inline auto vv(int m, int n) { return vector<vector<T>>(m, vector<T>(n, init)); }
  26.  
  27. template <class T> using mpq = priority_queue<T, vector<T>, greater<T>>;
  28. using vi = vector<int>;
  29. using ll = long long;
  30. using pii = pair<int, int>;
  31. using mint = atcoder::modint1000000007;
  32.  
  33. int main(int argc, char **argv)
  34. {
  35.     int n;
  36.     cin >> n;
  37.     vi a(n + 1);
  38.     map<int, int> cnt;
  39.     int last_seg = 0;
  40.     int first_seg = 0;
  41.     for (int i = 0; i <= n; ++i) {
  42.         cin >> a[i];
  43.         if (cnt.count(a[i])) {
  44.             first_seg = cnt[a[i]];
  45.             last_seg = n - i;
  46.         }
  47.         // cnt.insert(a[i]);
  48.         cnt[a[i]] = i;
  49.     }
  50.     last_seg += first_seg;
  51.     // dbg(last_seg);
  52.  
  53.     const int mod = int(1e9) + 7;
  54.     vi cnp1(n + 3), cnm1(n);
  55.     cnp1[0] = 1;
  56.     for (int i = 1; i <= n + 1; ++i) {
  57.         cnp1[i] = (mint(cnp1[i - 1]) * mint(n + 1 - i + 1) / mint(i)).val();
  58.     }
  59.     cnm1[0] = 1;
  60.     for (int i = 1; i <= n - 1; ++i) {
  61.         cnm1[i] = (mint(cnm1[i - 1]) * mint(n - 1 - i + 1) / mint(i)).val();
  62.     }
  63.     int k = n + 1;
  64.     vi dup(k + 1), no_dup(k + 1);
  65.     // dup[1] = 0, dup[2] = 1;
  66.  
  67.     auto comb = [last_seg, mod](int n, int r) {
  68.         static vi f(last_seg + 1);
  69.         if (f[0] == 0) {
  70.             f[0] = 1;
  71.             for (int i = 1; i <= last_seg; ++i)
  72.                 f[i] = (mint(f[i - 1]) * mint(last_seg - i + 1) / mint(i)).val();
  73.         }
  74.         return r <= last_seg ? f[r] : 0;
  75.     };
  76.     for (int i = 1; i <= k; ++i) {
  77.         dup[i] = (i <= 2 ? i - 1 : cnm1[i - 2]);
  78.         int repeat = comb(last_seg, i - 1);
  79.         no_dup[i] = ((ll(cnp1[i]) - dup[i] - repeat) % mod + mod) % mod;
  80.         // dbg(i, dup[i], no_dup[i], repeat);
  81.         cout << (ll(dup[i]) + no_dup[i] + mod) % mod << endl;
  82.     }
  83.     return 0;
  84. };
  85.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement