代码求调教
#include<bits/stdc++.h>
#define ll long long
#define ull long long
#define ld long double
#define pii pair<int, int>
#define endl '\n'
using namespace std;
const int MAXN = 1e6 + 6;
const int MOD = 1e9 + 7;
const int INF = 0x3fffffff;
const ll LLM = 0x3ffffffffffffff;
string s;
int num[11];
ull p[30];
priority_queue<ull> q;
ull solve(ull len) {
if (len == 0)return 0;
// cout << len << "\n";
for (int i = 0; i <= 9; i++) {
// cout << num[i] << ' ';
}
// cout << endl;
for (int i = 0; i <= 9; i++)
if (num[i] != 0)q.push(num[i]);
ull now = 1;
// cout << '#' << now << ' ';
for (ull i = q.top() + 1; i <= len; i++) {
now *= i;
// cout << now << " ";
}
// cout << "\n";
q.pop();
while (q.size()) {
now /= p[q.top()];
q.pop();
}
// cout << "&" << now << "\n";
return now;
}
ull dfs(int now) {
if (now >= s.size())return 0;
int len = s.size() - now - 1;
ull ans = 0;
for (int i = 0; i <= 9; i++) {
if (num[i] != 0 && i < s[now] - '0') {
num[i]--;
ans += solve(len);
num[i]++;
}
}
num[s[now] - '0']--;
// cout << ans << "\n";
ans += dfs(now + 1);
return ans;
}
signed main() {
cin >> s;
p[1] = 1;
for (int i = 2; i <= 20; i++) {
p[i] = p[i - 1] * i;
// cout << p[i] << "\n";
}
// cout << "\n";
for (char x : s)
num[x - '0']++;
cout << dfs(0) << endl;
return (1 ^ 0 ^ 1);
}
蒟蒻调了好久