Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define f first
- #define s second
- #define pb push_back
- using namespace std;
- typedef long long ll;
- string N, L, R;
- ll fact[20];
- ll solve(int mask, bool bot, bool up)
- {
- if (mask == (1 << N.size()) - 1) return 1;
- if (bot && up) return fact[N.size() - __builtin_popcount(mask)];
- int ret = 0;
- for (int i = 0; i < N.size(); i++) {
- if (mask & (1 << i)) continue;
- if (!bot && !up) {
- if (L[0] <= N[i] && N[i] <= R[0]) {
- ret += solve(mask | (1 << i), L[0] < N[i], N[i] < R[0]);
- }
- continue;
- }
- if (bot) {
- if (N[i] <= R[__builtin_popcount(mask)]) ret += solve(mask | (1 << i), true, up | (N[i] < R[__builtin_popcount(mask)]));
- }
- if (up) {
- if (__builtin_popcount(mask) >= L.size() || N[i] >= L[__builtin_popcount(mask)]) ret += solve(mask | (1 << i), bot | (__builtin_popcount(mask) >= L.size() || N[i] > L[__builtin_popcount(mask)]), true);
- }
- }
- return ret;
- }
- int cc[10];
- int main()
- {
- int t; cin >> t;
- while (t--) {
- fact[0] = 1ll;
- for (int i = 1; i < 20; i++) fact[i] = 1ll * fact[i - 1] * i;
- cin >> L >> R >> N;
- for (int i = 0; i < 10; i++) cc[i] = 0;
- for (int i = 0; i < N.size(); i++) cc[N[i] - '0']++;
- ll dv = 1ll;
- for (int i = 0; i < 10; i++) dv *= fact[cc[i]];
- cout << solve(0, 0, 0) / dv << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement