Submission #25160111
Source Code Expand
#include <bits/stdc++.h>
#include <cassert>
typedef long long int ll;
using namespace std;
// @@ !! LIM(perm mod debug f:updMaxMin coordCompr cmpNaive)
// ---- inserted library file perm.cc
template<typename T>
class IterPerm {
int cand_size;
int seq_size;
T perm;
vector<T> cands;
vector<int> idx;
void construct(const T& orig, int ss) {
cand_size = orig.size();
seq_size = ss;
perm = T(orig.begin(), orig.begin() + seq_size);
cands = vector<T>(seq_size);
if (seq_size > 0) cands.at(0) = orig;
idx = vector<int>(seq_size);
init();
}
void init() {
for (int i = 0; i < seq_size; i++) {
perm.at(i) = cands.at(0).at(i);
if (i > 0) {
cands.at(i) = T(cands.at(0).begin() + i, cands.at(0).end());
}
idx.at(i) = 0;
}
}
// IntPerm is implemented using IterPerm<vector<int>>, and
// it needs a constructor without parameter.
friend class IntPerm;
IterPerm() {}
public:
IterPerm(const T& orig, int ss) { construct(orig, ss); }
IterPerm(const T& orig) { construct(orig, orig.size()); }
const T& get() { return perm; }
bool next() {
int i = seq_size - 1;
while (i >= 0 && ++idx.at(i) >= cand_size - i) i--;
if (i < 0) {
init();
return false;
}
perm.at(i) = cands.at(i).at(idx.at(i));
for (int k = i + 1; k < seq_size; k++) {
for (int m = 0; m < cand_size - k; m++) {
int shift = m < idx.at(k - 1) ? 0 : 1;
cands.at(k).at(m) = cands.at(k - 1).at(m + shift);
}
idx.at(k) = 0;
perm.at(k) = cands.at(k).at(0);
}
return true;
}
};
class IntPerm {
IterPerm<vector<int>> itp;
void construct(int ns, int ss) {
vector<int> vec(ns);
iota(vec.begin(), vec.end(), 0);
itp = IterPerm(vec, ss);
}
public:
IntPerm(int ns, int ss) { construct(ns, ss); }
IntPerm(int ns) { construct(ns, ns); }
const vector<int>& get() { return itp.get(); }
bool next() { return itp.next(); }
};
template<typename T>
class IterComb {
vector<T> orig;
int c_size;
vector<T> comb;
vector<int> idx;
void init() {
for (int i = 0; i < c_size; i++) {
idx.at(i) = i;
comb.at(i) = orig.at(i);
}
}
public:
IterComb() {}
IterComb(vector<T> orig_, int c_size_)
: orig(orig_), c_size(c_size_), comb(c_size), idx(c_size) { init(); }
const vector<T>& get() { return comb; }
bool next() {
int n = orig.size();
int i = c_size - 1;
while (i >= 0 && ++idx.at(i) > n - (c_size - i)) i--;
if (i < 0) {
init();
return false;
}
int k = idx.at(i);
for ( ; i < c_size; i++, k++) {
idx.at(i) = k;
comb.at(i) = orig.at(k);
}
return true;
}
};
class IntComb {
IterComb<int> itc;
public:
IntComb(int n, int r) {
vector<int> seq(n);
iota(seq.begin(), seq.end(), 0);
itc = IterComb<int>(seq, r);
}
const vector<int>& get() { return itc.get(); }
bool next() { return itc.next(); }
};
class DupIntPerm {
int n;
int r;
vector<int> vec;
public:
DupIntPerm(int n_, int r_) : n(n_), r(r_), vec(r) {}
const vector<int>& get() { return vec; }
bool next() {
for (int i = r - 1; i >= 0; i--) {
if (++vec[i] < n) return true;
vec[i] = 0;
}
return false;
}
};
// ---- end perm.cc
// ---- inserted function f:gcd from util.cc
tuple<ll, ll, ll> mut_div(ll a, ll b, ll c, bool eff_c = true) {
// auto [g, s, t] = mut_div(a, b, c, eff_c)
// If eff_c is true (default),
// g == gcd(|a|, |b|) and as + bt == c, if such s,t exists
// (g, s, t) == (-1, -1, -1) otherwise
// If eff_c is false,
// g == gcd(|a|, |b|) and as + bt == g
// N.b. gcd(0, t) == gcd(t, 0) == t.
if (a == 0) {
if (eff_c) {
if (c % b != 0) return {-1, -1, -1};
else return {abs(b), 0, c / b};
}else {
if (b < 0) return {-b, 0, -1};
else return { b, 0, 1};
}
}else {
auto [g, t, u] = mut_div(b % a, a, c, eff_c);
// DLOGK(b%a, a, c, g, t, u);
if (g == -1) return {-1, -1, -1};
return {g, u - (b / a) * t, t};
}
}
// auto [g, s, t] = eGCD(a, b) ---> sa + tb == g == gcd(|a|, |b|)
// N.b. gcd(0, t) == gcd(t, 0) == t.
tuple<ll, ll, ll> eGCD(ll a, ll b) { return mut_div(a, b, 0, false); }
pair<ll, ll> crt_sub(ll a1, ll x1, ll a2, ll x2) {
// DLOGKL("crt_sub", a1, x1, a2, x2);
a1 = a1 % x1;
a2 = a2 % x2;
auto [g, s, t] = mut_div(x1, -x2, a2 - a1);
// DLOGK(g, s, t);
if (g == -1) return {-1, -1};
ll z = x1 / g * x2;
// DLOGK(z);
s = s % (x2 / g);
ll r = (x1 * s + a1) % z;
// DLOGK(r);
if (r < 0) r += z;
// DLOGK(r);
return {r, z};
};
// Chinese Remainder Theorem
//
// r = crt(a1, x1, a2, x2)
// ==> r = a1 (mod x1); r = a2 (mod x2); 0 <= r < lcm(x1, x2)
// If no such r exists, returns -1
// Note: x1 and x2 should >= 1. a1 and a2 can be negative or zero.
//
// r = crt(as, xs)
// ==> for all i. r = as[i] (mod xs[i]); 0 <= r < lcm(xs)
// If no such r exists, returns -1
// Note: xs[i] should >= 1. as[i] can be negative or zero.
// It should hold: len(xs) == len(as) > 0
ll crt(ll a1, ll x1, ll a2, ll x2) { return crt_sub(a1, x1, a2, x2).first; }
ll crt(vector<ll> as, vector<ll> xs) {
// DLOGKL("crt", as, xs);
assert(xs.size() == as.size() && xs.size() > 0);
ll r = as[0];
ll z = xs[0];
for (size_t i = 1; i < xs.size(); i++) {
// DLOGK(i, r, z, as[i], xs[i]);
tie(r, z) = crt_sub(r, z, as[i], xs[i]);
// DLOGK(r, z);
if (r == -1) return -1;
}
return r;
}
// ---- end f:gcd
// ---- inserted library file mod.cc
template<int mod=0>
struct FpG { // G for General
static ll dyn_mod;
static ll getMod() {
if (mod == 0) return dyn_mod;
else return mod;
}
static void setMod(ll _mod) { // effective only when mod == 0
dyn_mod = _mod;
}
static ll _conv(ll x) {
if (x >= getMod()) return x % getMod();
if (x >= 0) return x;
if (x >= -getMod()) return x + getMod();
ll y = x % getMod();
if (y == 0) return 0;
return y + getMod();
}
ll val;
FpG(int t = 0) : val(_conv(t)) {}
FpG(ll t) : val(_conv(t)) {}
FpG(const FpG& t) : val(t.val) {}
FpG& operator =(const FpG& t) { val = t.val; return *this; }
FpG& operator =(ll t) { val = _conv(t); return *this; }
FpG& operator =(int t) { val = _conv(t); return *this; }
FpG& operator +=(const FpG& t) {
val += t.val;
if (val >= getMod()) val -= getMod();
return *this;
}
FpG& operator -=(const FpG& t) {
val -= t.val;
if (val < 0) val += getMod();
return *this;
}
FpG& operator *=(const FpG& t) {
val = (val * t.val) % getMod();
return *this;
}
FpG inv() const {
if (val == 0) {
throw runtime_error("FpG::inv(): called for zero.");
}
auto [g, u, v] = eGCD(val, getMod());
return FpG(u);
}
FpG& operator /=(const FpG& t) {
return (*this) *= t.inv();
}
FpG operator +(const FpG& t) const { return FpG(val) += t; }
FpG operator -(const FpG& t) const { return FpG(val) -= t; }
FpG operator *(const FpG& t) const { return FpG(val) *= t; }
FpG operator /(const FpG& t) const { return FpG(val) /= t; }
FpG operator -() const { return FpG(-val); }
bool operator ==(const FpG& t) const { return val == t.val; }
bool operator !=(const FpG& t) const { return val != t.val; }
operator ll() const { return val; }
friend FpG operator +(int x, const FpG& y) { return FpG(x) + y; }
friend FpG operator -(int x, const FpG& y) { return FpG(x) - y; }
friend FpG operator *(int x, const FpG& y) { return FpG(x) * y; }
friend FpG operator /(int x, const FpG& y) { return FpG(x) / y; }
friend bool operator ==(int x, const FpG& y) { return FpG(x) == y; }
friend bool operator !=(int x, const FpG& y) { return FpG(x) != y; }
friend FpG operator +(ll x, const FpG& y) { return FpG(x) + y; }
friend FpG operator -(ll x, const FpG& y) { return FpG(x) - y; }
friend FpG operator *(ll x, const FpG& y) { return FpG(x) * y; }
friend FpG operator /(ll x, const FpG& y) { return FpG(x) / y; }
friend bool operator ==(ll x, const FpG& y) { return FpG(x) == y; }
friend bool operator !=(ll x, const FpG& y) { return FpG(x) != y; }
friend FpG operator +(const FpG& x, int y) { return x + FpG(y); }
friend FpG operator -(const FpG& x, int y) { return x - FpG(y); }
friend FpG operator *(const FpG& x, int y) { return x * FpG(y); }
friend FpG operator /(const FpG& x, int y) { return x / FpG(y); }
friend bool operator ==(const FpG& x, int y) { return x == FpG(y); }
friend bool operator !=(const FpG& x, int y) { return x != FpG(y); }
friend FpG operator +(const FpG& x, ll y) { return x + FpG(y); }
friend FpG operator -(const FpG& x, ll y) { return x - FpG(y); }
friend FpG operator *(const FpG& x, ll y) { return x * FpG(y); }
friend FpG operator /(const FpG& x, ll y) { return x / FpG(y); }
friend bool operator ==(const FpG& x, ll y) { return x == FpG(y); }
friend bool operator !=(const FpG& x, ll y) { return x != FpG(y); }
friend istream& operator>> (istream& is, FpG& t) {
ll x; is >> x;
t = x;
return is;
}
friend ostream& operator<< (ostream& os, const FpG& t) {
os << t.val;
return os;
}
};
template<int mod>
ll FpG<mod>::dyn_mod;
template<int mod=0>
class CombG {
int nMax;
vector<FpG<mod>> vFact;
vector<FpG<mod>> vInvFact;
public:
CombG(int nm) : nMax(nm), vFact(nm+1), vInvFact(nm+1) {
vFact.at(0) = 1;
for (int i = 1; i <= nMax; i++) vFact.at(i) = i * vFact.at(i-1);
vInvFact.at(nMax) = vFact.at(nMax).inv();
for (int i = nMax; i >= 1; i--) vInvFact.at(i-1) = i * vInvFact.at(i);
}
FpG<mod> fact(int n) { return vFact.at(n); }
FpG<mod> comb(int n, int r) {
return vFact.at(n) * vInvFact.at(r) * vInvFact.at(n-r);
}
// The number of permutation extracting r from n.
FpG<mod> perm(int n, int r) {
return vFact.at(n) * vInvFact.at(n-r);
}
};
constexpr int primeA = 1'000'000'007;
constexpr int primeB = 998'244'353; // '
using FpA = FpG<primeA>;
using FpB = FpG<primeB>;
using CombA = CombG<primeA>;
using CombB = CombG<primeB>;
// ---- end mod.cc
// ---- inserted function f:<< from util.cc
template <typename T1, typename T2>
ostream& operator<< (ostream& os, const pair<T1,T2>& p) {
os << "(" << p.first << ", " << p.second << ")";
return os;
}
template <typename T1, typename T2, typename T3>
ostream& operator<< (ostream& os, const tuple<T1,T2,T3>& t) {
os << "(" << get<0>(t) << ", " << get<1>(t)
<< ", " << get<2>(t) << ")";
return os;
}
template <typename T1, typename T2, typename T3, typename T4>
ostream& operator<< (ostream& os, const tuple<T1,T2,T3,T4>& t) {
os << "(" << get<0>(t) << ", " << get<1>(t)
<< ", " << get<2>(t) << ", " << get<3>(t) << ")";
return os;
}
template <typename T>
ostream& operator<< (ostream& os, const vector<T>& v) {
os << '[';
for (auto it = v.begin(); it != v.end(); it++) {
if (it != v.begin()) os << ", ";
os << *it;
}
os << ']';
return os;
}
template <typename T, typename C>
ostream& operator<< (ostream& os, const set<T, C>& v) {
os << '{';
for (auto it = v.begin(); it != v.end(); it++) {
if (it != v.begin()) os << ", ";
os << *it;
}
os << '}';
return os;
}
template <typename T, typename C>
ostream& operator<< (ostream& os, const unordered_set<T, C>& v) {
os << '{';
for (auto it = v.begin(); it != v.end(); it++) {
if (it != v.begin()) os << ", ";
os << *it;
}
os << '}';
return os;
}
template <typename T, typename C>
ostream& operator<< (ostream& os, const multiset<T, C>& v) {
os << '{';
for (auto it = v.begin(); it != v.end(); it++) {
if (it != v.begin()) os << ", ";
os << *it;
}
os << '}';
return os;
}
template <typename T1, typename T2, typename C>
ostream& operator<< (ostream& os, const map<T1, T2, C>& mp) {
os << '[';
for (auto it = mp.begin(); it != mp.end(); it++) {
if (it != mp.begin()) os << ", ";
os << it->first << ": " << it->second;
}
os << ']';
return os;
}
template <typename T1, typename T2, typename C>
ostream& operator<< (ostream& os, const unordered_map<T1, T2, C>& mp) {
os << '[';
for (auto it = mp.begin(); it != mp.end(); it++) {
if (it != mp.begin()) os << ", ";
os << it->first << ": " << it->second;
}
os << ']';
return os;
}
template <typename T, typename T2>
ostream& operator<< (ostream& os, const queue<T, T2>& orig) {
queue<T, T2> que(orig);
bool first = true;
os << '[';
while (!que.empty()) {
T x = que.front(); que.pop();
if (!first) os << ", ";
os << x;
first = false;
}
return os << ']';
}
template <typename T, typename T2>
ostream& operator<< (ostream& os, const deque<T, T2>& orig) {
deque<T, T2> que(orig);
bool first = true;
os << '[';
while (!que.empty()) {
T x = que.front(); que.pop_front();
if (!first) os << ", ";
os << x;
first = false;
}
return os << ']';
}
template <typename T, typename T2, typename T3>
ostream& operator<< (ostream& os, const priority_queue<T, T2, T3>& orig) {
priority_queue<T, T2, T3> pq(orig);
bool first = true;
os << '[';
while (!pq.empty()) {
T x = pq.top(); pq.pop();
if (!first) os << ", ";
os << x;
first = false;
}
return os << ']';
}
template <typename T>
ostream& operator<< (ostream& os, const stack<T>& st) {
stack<T> tmp(st);
os << '[';
bool first = true;
while (!tmp.empty()) {
T& t = tmp.top();
if (first) first = false;
else os << ", ";
os << t;
tmp.pop();
}
os << ']';
return os;
}
#if __cplusplus >= 201703L
template <typename T>
ostream& operator<< (ostream& os, const optional<T>& t) {
if (t.has_value()) os << "v(" << t.value() << ")";
else os << "nullopt";
return os;
}
#endif
ostream& operator<< (ostream& os, int8_t x) {
os << (int32_t)x;
return os;
}
// ---- end f:<<
// ---- inserted library file debug.cc
template <class... Args>
string dbgFormat(const char* fmt, Args... args) {
size_t len = snprintf(nullptr, 0, fmt, args...);
char buf[len + 1];
snprintf(buf, len + 1, fmt, args...);
return string(buf);
}
template <class Head>
void dbgLog(bool with_nl, Head&& head) {
cerr << head;
if (with_nl) cerr << endl;
}
template <class Head, class... Tail>
void dbgLog(bool with_nl, Head&& head, Tail&&... tail)
{
cerr << head << " ";
dbgLog(with_nl, forward<Tail>(tail)...);
}
#if DEBUG
#define DLOG(...) dbgLog(true, __VA_ARGS__)
#define DLOGNNL(...) dbgLog(false, __VA_ARGS__)
#define DFMT(...) cerr << dbgFormat(__VA_ARGS__) << endl
#define DCALL(func, ...) func(__VA_ARGS__)
#else
#define DLOG(...)
#define DLOGNNL(...)
#define DFMT(...)
#define DCALL(func, ...)
#endif
/*
#if DEBUG_LIB
#define DLOG_LIB(...) dbgLog(true, __VA_ARGS__)
#define DLOGNNL_LIB(...) dbgLog(false, __VA_ARGS__)
#define DFMT_LIB(...) cerr << dbgFormat(__VA_ARGS__) << endl
#define DCALL_LIB(func, ...) func(__VA_ARGS__)
#else
#define DLOG_LIB(...)
#define DFMT_LIB(...)
#define DCALL_LIB(func, ...)
#endif
*/
#define DUP1(E1) #E1 "=", E1
#define DUP2(E1,E2) DUP1(E1), DUP1(E2)
#define DUP3(E1,...) DUP1(E1), DUP2(__VA_ARGS__)
#define DUP4(E1,...) DUP1(E1), DUP3(__VA_ARGS__)
#define DUP5(E1,...) DUP1(E1), DUP4(__VA_ARGS__)
#define DUP6(E1,...) DUP1(E1), DUP5(__VA_ARGS__)
#define DUP7(E1,...) DUP1(E1), DUP6(__VA_ARGS__)
#define DUP8(E1,...) DUP1(E1), DUP7(__VA_ARGS__)
#define DUP9(E1,...) DUP1(E1), DUP8(__VA_ARGS__)
#define DUP10(E1,...) DUP1(E1), DUP9(__VA_ARGS__)
#define DUP11(E1,...) DUP1(E1), DUP10(__VA_ARGS__)
#define DUP12(E1,...) DUP1(E1), DUP11(__VA_ARGS__)
#define GET_MACRO(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,NAME,...) NAME
#define DUP(...) GET_MACRO(__VA_ARGS__, DUP12, DUP11, DUP10, DUP9, DUP8, DUP7, DUP6, DUP5, DUP4, DUP3, DUP2, DUP1)(__VA_ARGS__)
#define DLOGK(...) DLOG(DUP(__VA_ARGS__))
#define DLOGKL(lab, ...) DLOG(lab, DUP(__VA_ARGS__))
#if DEBUG_LIB
#define DLOG_LIB DLOG
#define DLOGK_LIB DLOGK
#define DLOGKL_LIB DLOGKL
#endif
// ---- end debug.cc
// ---- inserted function f:updMaxMin from util.cc
template<typename T>
bool updMax(T& tmax, const T& x) {
if (x > tmax) { tmax = x; return true; }
else { return false; }
}
template<typename T>
bool updMin(T& tmin, const T& x) {
if (x < tmin) { tmin = x; return true; }
else { return false; }
}
// ---- end f:updMaxMin
// ---- inserted library file coordCompr.cc
class CoordCompr {
bool built;
map<ll, int> mp; // map from an original value to a compressed value
vector<ll> rev; // vector of original values
void build() {
built = true;
sort(rev.begin(), rev.end());
rev.erase(unique(rev.begin(), rev.end()), rev.end());
mp = map<ll, int>();
for (size_t i = 0; i < rev.size(); i++) mp[rev[i]] = i;
}
public:
CoordCompr() : built(false) {}
CoordCompr(const vector<ll>& vec) : built(false), rev(vec) {}
CoordCompr(vector<ll>&& vec) : built(false), rev(move(vec)) {}
void add(ll x) {
rev.push_back(x);
built = false;
}
void add(const vector<ll>& vec) {
for (ll x : vec) rev.push_back(x);
built = false;
}
int c(ll x) {
if (! built) build();
return mp[x];
}
ll d(int i) {
if (! built) build();
return rev[i];
}
int size() {
if (! built) build();
return rev.size();
}
};
// ---- end coordCompr.cc
// ---- inserted library file cmpNaive.cc
const string end_mark("^__=end=__^");
int naive(istream& cin, ostream& cout);
int body(istream& cin, ostream& cout);
void cmpNaive() {
while (true) {
string s;
getline(cin, s);
bool run_body;
if (s.at(0) == 'Q') {
return;
}else if (s.at(0) == 'B') {
run_body = true;
}else if (s.at(0) == 'N') {
run_body = false;
}else {
cerr << "Unknown body/naive specifier.\n";
exit(1);
}
string input_s;
while (true) {
getline(cin, s);
if (s == end_mark) break;
input_s += s;
input_s += "\n";
}
stringstream ss_in(move(input_s));
stringstream ss_out;
if (run_body) {
body(ss_in, ss_out);
}else {
naive(ss_in, ss_out);
}
cout << ss_out.str() << end_mark << endl;
}
}
int main(int argc, char *argv[]) {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout << setprecision(20);
#if CMPNAIVE
if (argc == 2) {
if (strcmp(argv[1], "cmpNaive") == 0) {
cmpNaive();
}else if (strcmp(argv[1], "naive") == 0) {
naive(cin, cout);
}else if (strcmp(argv[1], "skip") == 0) {
exit(0);
}else {
cerr << "Unknown argument.\n";
exit(1);
}
}else {
#endif
body(cin, cout);
#if CMPNAIVE
}
#endif
return 0;
}
/*
int naive(istream& cin, ostream& cout) {
return 0;
}
int body(istream& cin, ostream& cout) {
return 0;
}
*/
// ---- end cmpNaive.cc
// @@ !! LIM -- end mark --
using Fp = FpA;
ll lis(const vector<int>& vec) {
ll big = 1e18;
ll N = vec.size();
vector<ll> res(N, big);
for (ll i = 0; i < N; i++) {
for (ll p = 0; p < N; p++) {
if (vec[i] <= res[p]) {
res[p] = vec[i];
break;
}
}
}
ll i = 0;
for (; i < N && res[i] < big; i++);
return i;
}
int naive(istream& cin, ostream& cout) {
ll N; cin >> N;
vector<ll> A(N);
ll vmax = 0;
for (ll i = 0; i < N; i++) {
cin >> A[i];
vmax = max(vmax, A[i]);
}
DupIntPerm dip(vmax, N);
const vector<int>& v = dip.get();
Fp sum = 0;
Fp cnt = 0;
do {
bool ok = true;
for (ll i = 0; i < N; i++) {
if (v[i] >= A[i]) {
ok = false;
break;
}
}
if (! ok) continue;
sum += Fp(lis(v));
cnt += Fp(1);
}while (dip.next());
DLOGK(sum, cnt);
Fp ans = sum / cnt;
cout << ans << endl;
return 0;
}
int body(istream& cin, ostream& cout) {
ll N; cin >> N;
vector<ll> A(N);
for (ll i = 0; i < N; i++) {
cin >> A[i];
A[i]++;
}
CoordCompr cc(A);
cc.add(0); cc.add(1);
auto check = [&](const vector<int>& vec) -> bool {
vector<ll> appear(N);
for (ll i = 0; i < N; i++) appear[vec[i]] += 1;
ll cnt = 0;
for (ll i = 0; i < N && appear[i] > 0; i++) cnt += appear[i];
return cnt == N;
};
auto binom = [&](ll n, ll r) -> Fp {
// DLOGKL("binom", n, r);
if (r < 0 || r > n) return Fp(0);
Fp x = 1;
Fp y = 1;
for (ll t = 0; t < r; t++) {
x *= n - t;
y *= r - t;
}
Fp z = x / y;
// DLOGK(n, r, x, y, z);
return z;
};
const ll big = 1e18;
auto num_comb = [&](const vector<int>& vec) -> Fp {
DLOG(vec);
vector<ll> B(N, big);
for (ll i = 0; i < N; i++) updMin(B[vec[i]], A[i]);
ll K = 0; for (; K < N && B[K] < big; K++);
ll M = cc.size();
vector tbl(K + 1, vector<Fp>(M));
tbl[0][0] = 1;
for (ll k = 1; k <= K; k++) {
for (ll m = 1; m+1 < M; m++) {
ll l = cc.d(m);
ll r = cc.d(m+1);
if (B[k-1] < r) continue;
for (ll i = k-1; i >= 0; i--) {
Fp cb = binom(r - l, k - i);
Fp t = 0;
for (ll p = 0; p < m; p++) t += tbl[i][p];
// DLOGK(k, m, l, r, i, cb, t);
tbl[k][m] += cb * t;
if (i == 0 || B[i-1] < r) break;
}
}
DLOGK(k, tbl[k]);
}
Fp ret = 0;
for (ll m = 0; m < M; m++) ret += tbl[K][m];
return ret;
};
DupIntPerm dip(N, N);
const vector<int>& v = dip.get();
Fp sum = 0;
do {
if (check(v)) {
ll len = lis(v);
Fp c = num_comb(v);
DLOGK(v, len, c);
sum += len * c;
}
}while (dip.next());
Fp tot = 1;
for (ll i = 0; i < N; i++) tot *= Fp(A[i] - 1);
DLOGK(sum, tot);
cout << sum / tot << endl;
return 0;
}
Submission Info
| Submission Time |
|
| Task |
E - Random LIS |
| User |
yamate11 |
| Language |
C++ (GCC 9.2.1) |
| Score |
700 |
| Code Size |
21945 Byte |
| Status |
AC |
| Exec Time |
23 ms |
| Memory |
3676 KiB |
Compile Error
./Main.cpp: In function ‘int main(int, char**)’:
./Main.cpp:734:14: warning: unused parameter ‘argc’ [-Wunused-parameter]
734 | int main(int argc, char *argv[]) {
| ~~~~^~~~
./Main.cpp:734:26: warning: unused parameter ‘argv’ [-Wunused-parameter]
734 | int main(int argc, char *argv[]) {
| ~~~~~~^~~~~~
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
700 / 700 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
s1.txt, s2.txt, s3.txt |
| All |
01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt, 31.txt, s1.txt, s2.txt, s3.txt |
| Case Name |
Status |
Exec Time |
Memory |
| 01.txt |
AC |
15 ms |
3580 KiB |
| 02.txt |
AC |
13 ms |
3520 KiB |
| 03.txt |
AC |
6 ms |
3572 KiB |
| 04.txt |
AC |
11 ms |
3528 KiB |
| 05.txt |
AC |
3 ms |
3596 KiB |
| 06.txt |
AC |
18 ms |
3588 KiB |
| 07.txt |
AC |
13 ms |
3536 KiB |
| 08.txt |
AC |
12 ms |
3528 KiB |
| 09.txt |
AC |
12 ms |
3532 KiB |
| 10.txt |
AC |
11 ms |
3676 KiB |
| 11.txt |
AC |
2 ms |
3628 KiB |
| 12.txt |
AC |
11 ms |
3672 KiB |
| 13.txt |
AC |
3 ms |
3652 KiB |
| 14.txt |
AC |
2 ms |
3596 KiB |
| 15.txt |
AC |
3 ms |
3520 KiB |
| 16.txt |
AC |
10 ms |
3632 KiB |
| 17.txt |
AC |
12 ms |
3632 KiB |
| 18.txt |
AC |
13 ms |
3532 KiB |
| 19.txt |
AC |
14 ms |
3528 KiB |
| 20.txt |
AC |
15 ms |
3636 KiB |
| 21.txt |
AC |
21 ms |
3636 KiB |
| 22.txt |
AC |
13 ms |
3524 KiB |
| 23.txt |
AC |
14 ms |
3660 KiB |
| 24.txt |
AC |
15 ms |
3632 KiB |
| 25.txt |
AC |
12 ms |
3628 KiB |
| 26.txt |
AC |
11 ms |
3636 KiB |
| 27.txt |
AC |
23 ms |
3584 KiB |
| 28.txt |
AC |
13 ms |
3584 KiB |
| 29.txt |
AC |
14 ms |
3528 KiB |
| 30.txt |
AC |
16 ms |
3536 KiB |
| 31.txt |
AC |
14 ms |
3636 KiB |
| s1.txt |
AC |
2 ms |
3524 KiB |
| s2.txt |
AC |
2 ms |
3596 KiB |
| s3.txt |
AC |
16 ms |
3532 KiB |