#ifndef INCLUDED_MAIN #define INCLUDED_MAIN #include __FILE__ int main(void) { string s; cin>>s; ll n=s.size(); vl ct(10); rep(i,n) ct[s[i]-'0']++; factset fs((ll)s.size()); ll d=1; rep(D,10) { d=d*fs.fact(ct[D])%mod; } ll ans=fs.fact(n-1); ans=ans*(n-ct[0])%mod; ans=ans*modpow(d,998244351ll,1)%mod; cout< using namespace std; #define rep(i,n) for(ll i=0;i #define vc vector #define pb push_back ll modpow(ll fl, ll po, ll mode) { // mode: 0=modなし, 1=modあり ll ret=1; if (mode) { while (po>0) { if (po&1) ret=(ret*fl)%mod; fl=(fl*fl)%mod; po>>=1; } } else { while (po>0) { if(po&1) ret*=fl; fl*=fl; po>>=1; } } return ret; } class factset { public: vl _fact; vl _inv; ll __n; factset(ll n):_fact(n+1),_inv(n+1),__n(n) { _fact[0]=1; srep(i,1,__n) { _fact[i]=_fact[i-1]*i; _fact[i]%=mod; } _inv[__n]=modpow(_fact[__n],mod-2,1); for(int i=__n-1;i>=0;i--) { _inv[i]=_inv[i+1]*(i+1); _inv[i]%=mod; } } ll fact(ll x) { assert(0<=x && x<=__n); return _fact[x]; } ll inv(ll x) { assert(0<=x && x<=__n); return _inv[x]; } ll comb(ll nn,ll k) { ll ans=1; ans*=_fact[nn]; ans%=mod; ans*=_inv[nn-k]; ans%=mod; ans*=_inv[k]; return ans%mod; } }; ll op(ll a,ll b) {return max(a,b);} ll e() {return -Winf; } template bool chmin(T& a, T b){if(a > b){a = b; return true;} return false;} template bool chmax(T& a, T b){if(a < b){a = b; return true;} return false;} void no() { cout<<"No"<