Submission #59211157
Source Code Expand
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> p_ll;
#define all(vec) vec.begin(), vec.end()
#define repr(i,from,to) for (ll i=from; i<to; ++i)
#define rep(i,N) repr(i,0,N)
#define per(i,N) for(ll i=N-1; i>=0; --i)
template<class T>
void debug(T itr1, T itr2) { auto now = itr1; while(now<itr2) { cout << *now << " "; now++; } cout << endl; }
const ll INF = (1ll<<61)-1;
ll gcd(ll a, ll b) { if (a<b) swap(a,b); return b==0 ? a : gcd(b, a%b); }
// --------------------------------------------
// mod
// --------------------------------------------
const ll MOD = 998244353;
ll inv(ll a, ll m=MOD) { ll b = m, x = 1, y = 0; while (b!=0) { int d = a/b; a -= b*d; swap(a,b); x -= y*d; swap(x,y); } return (x+m)%m; }
ll mpow(ll n, ll p, ll m=MOD) { ll result = 1; for (ll i=1; i<=p; i=i<<1) { if (p&i) result = result*n%m; n = n*n%m; } return result; }
ll madd(ll x, ll y, ll m=MOD) { return (x+y)%m; }
ll msub(ll x, ll y, ll m=MOD) { return (x-y+m)%m; }
ll mmul(ll x, ll y, ll m=MOD) { return x*y%m; }
ll mdiv(ll x, ll y, ll m=MOD) { return mmul(x, inv(y)); }
vector<ll> fac;
void c_fac(int x=pow(10,6)+10) { fac.resize(x,true); rep(i,x) fac[i] = i ? (fac[i-1]*i)%MOD : 1; }
ll nck(ll n, ll k) { return mdiv(fac[n], mmul(fac[k],fac[n-k])); }
int main() {
c_fac();
ll N; cin >> N;
vector<ll> A(N); rep(i,N) cin >> A[i];
vector<vector<ll>> from(N);
per(i,N) from[A[i]].push_back(i+1);
vector<vector<ll>> adj(N+1);
rep(i,N) {
if (from[i].size()==0) continue;
adj[i].push_back(from[i][0]);
rep(j,from[i].size()-1) adj[from[i][j]].push_back(from[i][j+1]);
}
// rep(i,N) { cout << i << ": "; debug(all(adj[i])); }
vector<ll> size(N+1);
auto dfs = [&] (auto dfs, ll n) -> ll {
size[n] = 1;
for (ll x: adj[n]) size[n] += dfs(dfs, x);
return size[n];
};
dfs(dfs, 0);
ll result = 1;
rep(i,N+1) {
if (adj[i].size()<=1) continue;
ll now = size[i]-1;
rep(j,adj[i].size()-1) {
result = result * nck(now, size[adj[i][j]]) % MOD;
now -= size[adj[i][j]];
}
}
cout << result << endl;
return 0;
}
Submission Info
| Submission Time |
|
| Task |
B - Typical Permutation Descriptor |
| User |
sak |
| Language |
C++ 20 (gcc 12.2) |
| Score |
900 |
| Code Size |
2184 Byte |
| Status |
AC |
| Exec Time |
91 ms |
| Memory |
57256 KiB |
Compile Error
Main.cpp: In function ‘ll mdiv(ll, ll, ll)’:
Main.cpp:25:24: warning: unused parameter ‘m’ [-Wunused-parameter]
25 | ll mdiv(ll x, ll y, ll m=MOD) { return mmul(x, inv(y)); }
| ~~~^~~~~
Main.cpp: In function ‘int main()’:
Main.cpp:7:42: warning: comparison of integer expressions of different signedness: ‘ll’ {aka ‘long long int’} and ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
7 | #define repr(i,from,to) for (ll i=from; i<to; ++i)
| ^
Main.cpp:8:18: note: in expansion of macro ‘repr’
8 | #define rep(i,N) repr(i,0,N)
| ^~~~
Main.cpp:45:5: note: in expansion of macro ‘rep’
45 | rep(j,from[i].size()-1) adj[from[i][j]].push_back(from[i][j+1]);
| ^~~
Main.cpp:7:42: warning: comparison of integer expressions of different signedness: ‘ll’ {aka ‘long long int’} and ‘std::vector<long long int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
7 | #define repr(i,from,to) for (ll i=from; i<to; ++i)
| ^
Main.cpp:8:18: note: in expansion of macro ‘repr’
8 | #define rep(i,N) repr(i,0,N)
| ^~~~
Main.cpp:62:5: note: in expansion of macro ‘rep’
62 | rep(j,adj[i].size()-1) {
| ^~~
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
900 / 900 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
example.txt, example_2.txt |
| All |
example.txt, example_2.txt, one.txt, path.txt, randomTree_10.txt, randomTree_1082.txt, randomTree_1132.txt, randomTree_1970.txt, randomTree_2.txt, randomTree_20.txt, randomTree_26411.txt, randomTree_2_2.txt, randomTree_2_3.txt, randomTree_328.txt, randomTree_36.txt, randomTree_4.txt, randomTree_40.txt, randomTree_4154.txt, randomTree_7898.txt, randomTree_79.txt, randomTree_8.txt, randomTree_810.txt, randomTree_88.txt, randomTree_98.txt, star.txt |
| Case Name |
Status |
Exec Time |
Memory |
| example.txt |
AC |
9 ms |
10880 KiB |
| example_2.txt |
AC |
9 ms |
10848 KiB |
| one.txt |
AC |
9 ms |
10876 KiB |
| path.txt |
AC |
91 ms |
57256 KiB |
| randomTree_10.txt |
AC |
9 ms |
10832 KiB |
| randomTree_1082.txt |
AC |
10 ms |
10944 KiB |
| randomTree_1132.txt |
AC |
9 ms |
10840 KiB |
| randomTree_1970.txt |
AC |
10 ms |
10844 KiB |
| randomTree_2.txt |
AC |
9 ms |
10940 KiB |
| randomTree_20.txt |
AC |
9 ms |
10940 KiB |
| randomTree_26411.txt |
AC |
17 ms |
13820 KiB |
| randomTree_2_2.txt |
AC |
9 ms |
10876 KiB |
| randomTree_2_3.txt |
AC |
10 ms |
10792 KiB |
| randomTree_328.txt |
AC |
10 ms |
10896 KiB |
| randomTree_36.txt |
AC |
9 ms |
10776 KiB |
| randomTree_4.txt |
AC |
9 ms |
10872 KiB |
| randomTree_40.txt |
AC |
9 ms |
10840 KiB |
| randomTree_4154.txt |
AC |
10 ms |
11296 KiB |
| randomTree_7898.txt |
AC |
11 ms |
11776 KiB |
| randomTree_79.txt |
AC |
10 ms |
10948 KiB |
| randomTree_8.txt |
AC |
10 ms |
10772 KiB |
| randomTree_810.txt |
AC |
9 ms |
10744 KiB |
| randomTree_88.txt |
AC |
9 ms |
10776 KiB |
| randomTree_98.txt |
AC |
10 ms |
10712 KiB |
| star.txt |
AC |
62 ms |
50360 KiB |