from collections import defaultdict, deque, Counter from functools import cache # import copy from itertools import combinations, permutations, product, accumulate, groupby, chain from more_itertools import distinct_permutations from heapq import heapify, heappop, heappush, heappushpop import math import bisect from pprint import pprint from random import randint, shuffle, randrange from sortedcontainers import SortedSet, SortedList, SortedDict import sys sys.setrecursionlimit(5000) input = lambda: sys.stdin.readline().rstrip('\n') inf = float('inf') mod1 = 10**9+7 mod2 = 998244353 def ceil_div(x, y): return -(-x//y) ################################################# def cmb(n, r): if r < 0 or r > n: return 0 r = min(r, n-r) return fact[n]*factinv[r]%p*factinv[n-r]%p def pmt(n, r): if r < 0 or r > n: return 0 return fact[n]*factinv[n-r]%p p = mod2 N = 10**6 #Nは必要分だけ用意する fact = [1, 1] #fact[n]: n! mod p factinv = [1, 1] #factinv[n]: n!^(-1) mod p inv = [0, 1] #inv[n]: n^(-1) mod p for i in range(2, N+1): fact.append((fact[-1]*i)%p) inv.append((-inv[p%i]*(p//i))%p) factinv.append((factinv[-1]*inv[-1])%p) N = input() D = len(N) cnt = Counter(map(int, N)) ans = cmb(D-1, cnt[0]) D -= cnt[0] for k in range(1, 10): ans *= cmb(D, cnt[k]) ans %= mod2 D -= cnt[k] print(ans)