結果
| 問題 |
No.171 スワップ文字列(Med)
|
| コンテスト | |
| ユーザー |
izuru_matsuura
|
| 提出日時 | 2016-06-21 09:45:45 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 5 ms / 1,000 ms |
| コード長 | 1,660 bytes |
| コンパイル時間 | 1,418 ms |
| コンパイル使用メモリ | 167,356 KB |
| 実行使用メモリ | 7,552 KB |
| 最終ジャッジ日時 | 2024-10-11 18:15:57 |
| 合計ジャッジ時間 | 2,062 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 10 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
namespace {
typedef double real;
typedef long long ll;
template<class T> ostream& operator<<(ostream& os, const vector<T>& vs) {
if (vs.empty()) return os << "[]";
os << "[" << vs[0];
for (int i = 1; i < vs.size(); i++) os << " " << vs[i];
return os << "]";
}
template<class T> istream& operator>>(istream& is, vector<T>& vs) {
for (auto it = vs.begin(); it != vs.end(); it++) is >> *it;
return is;
}
int MOD = 573;
string s;
void input() {
cin >> s;
}
int fact(int n) {
int r = 1;
for (int i = 1; i <= n; i++) {
r *= i;
}
return r;
}
const int N = 1005;
int dp[N][N];
void init_pascal() {
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for (int i = 1; i < N; i++) {
dp[i][0] = dp[i - 1][0];
for (int j = 1; j <= i; j++) {
dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1]) % MOD;
}
}
}
int comb(int n, int k) {
return dp[n][k];
}
void solve() {
init_pascal();
map<char, int> M;
for (int i = 0; i < s.size(); i++) {
M[ s[i] ]++;
}
int ans = 1;
int n = s.size();
for (auto it = M.begin(); ; it++) {
if (++it == M.end()) break;
--it;
int k = it->second;
ans *= comb(n, k);
ans %= MOD;
n -= k;
}
cout << (ans + MOD - 1) % MOD << endl;
}
}
int main() {
input(); solve();
return 0;
}
izuru_matsuura