// 想定解: 組み合わせ // 事前計算O(max(|S|)^2) 入力処理O(|S|+T), T=文字の種類(26) #include using namespace std; template void rc(_T v,_T mn,_T mx){if(v >c;static int maxn; if(n<0||m<0||nmaxn){c.resize(n+1);for(int i=maxn;i<=n;i++)c[i].resize(i+1);c[0][0]=1;for(int i=maxn+1;i<=n;i++){ for(int j=1;j> S; rc((int)S.size(), 1, 1000); for(const auto &c : S) rc(c, 'A', 'Z'); for(const auto &c : S) s[c]++; int n = S.size(); int res = 1; for(int i = 'A'; i <= 'Z'; i++){ (res *= combination_mod(n, s[i])) %= MOD; n -= s[i]; } // (res-1) % MOD (res += MOD-1) %= MOD; cout << res << endl; }