#include #include using namespace std; using namespace atcoder; #define rep(i, n) REP(i, 0, n) #define REP(i, s, e) for (ll i = (s); i < (ll)(e); i++) #define repr(i, n) REPR(i, n, 0) #define REPR(i, s, e) for (ll i = (ll)(s - 1); i >= (ll)(e); i--) #define all(r) r.begin(), r.end() #define rall(r) r.rbegin(), r.rend() typedef long long ll; typedef vector vi; typedef vector vl; template T chmax(T& a, const U& b) { if (a >= b) return false; a = b; return true; } template T chmin(T& a, const U& b) { if (a <= b) return false; a = b; return true; } void yes_no(bool f, string yes = "Yes", string no = "No") { cout << (f ? yes : no) << "\n"; } template struct PascalTriangle { T d[MAX_SIZE][MAX_SIZE]; void precalc() { rep(i, MAX_SIZE) { d[i][0] = d[i][i] = 1; REP(j, 1, i) { d[i][j] = d[i - 1][j - 1] + d[i - 1][j]; if (mod != 0) d[i][j] %= mod; } } } PascalTriangle() { precalc(); } T comb(int n, int r) { return d[n][r]; } }; void solve() { string s; cin >> s; map mp; for (auto&& c : s) mp[c]++; PascalTriangle pas; ll ans = 1, sz = 0; for (auto&& [k, v] : mp) { (ans *= pas.comb(sz + v, v)) %= 573; sz += v; } --ans; if (ans < 0) ans += 573; cout << ans << "\n"; } int main() { cin.tie(0); ios::sync_with_stdio(false); int t = 1; // multi-testcase // cin >> t; rep(ti, t) solve(); return 0; }