Untitled

 avatar
unknown
plain_text
2 months ago
3.4 kB
6
Indexable
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;

#define fi first
#define se second
#define pp push_back
#define all(x) (x).begin(), (x).end()
#define Ones(n) __builtin_popcount(n)
#define endl '\n'
#define mem(arrr, xx) memset(arrr,xx,sizeof arrr)
//#define int long long
#define debug(x) cout << (#x) << " = " << x << endl

void Gamal() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
#ifdef Clion
    freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
#endif
}

int dx[] = {+0, +0, -1, +1, +1, +1, -1, -1};
int dy[] = {-1, +1, +0, +0, +1, -1, +1, -1};

const double EPS = 1e-9;
const ll OO = 0X3F3F3F3F3F3F3F3F;
const int N = 2e5 + 5, INF = INT_MAX, MOD = 1e9 + 7, LOG = 20;

ll dp[2][2][2][14][110][110];
string l, r;
int mod;

ll slv(bool start, bool ub, bool lb, int i, int rem, int sum) {
    if (i == r.size())return (rem == 0 && sum == 0) ? 1 : -2;
    ll &ret = dp[start][ub][lb][i][rem][sum];
    if (~ret)return ret;
    ret = -2;
    int rt = (ub ? r[i] - '0' : 9);
    int lf = (lb ? l[i] - '0' : 0);
    for (int j = lf; j <= rt; ++j) {
        if (!start && j == 0) {
            ret = max(ret, slv(false, ub && (j == rt), lb && (j == lf), i + 1, (rem * 10 + j) % mod,
                               (sum + j) % mod));
        } else {
            auto p = slv(true, ub && (j == rt), lb && (j == lf), i + 1, (rem * 10 + j) % mod,
                         (sum + j) % mod);
            if (p >= 0) ret = max(ret, j * p);
        }
    }
    return ret;
}

bool flag;

ll build(bool start, bool ub, bool lb, int i, int rem, int sum, ll num) {
    if (i == r.size())return num;
    int rt = (ub ? r[i] - '0' : 9);
    int lf = (lb ? l[i] - '0' : 0);
    ll mx = slv(start, ub, lb, i, rem, sum);
    for (int j = rt; j >= lf; --j) {
        ll val;
        if (!start && j == 0) {
            val = slv(false, ub && (j == rt), lb && (j == lf), i + 1, (rem * 10 + j) % mod,
                      (sum + j) % mod);
        }
        else {
            auto p = slv(true, ub && (j == rt), lb && (j == lf), i + 1, (rem * 10 + j) % mod,
                         (sum + j) % mod);
            if (p >= 0) val = j * p;
            else val = -2;
        }

        if(val == -2) continue;
        if (flag || val == mx) {
            num = num * 10 + j;
            return build(start || j > 0, ub && (j == rt), lb && (j == lf), i + 1, (rem * 10 + j) % mod, (sum + j) % mod,
                         num);
        }
    }
    return 0;
}

void solve() {
    cin >> l >> r;
    while (l.size() < r.size())
        l = "0" + l;
    ll best = -1, ans = 0;
    for (int i = 2; i < 110; ++i) {
        mod = i;
        mem(dp, -1);
        ll x = slv(0, 1, 1, 0, 0, 0);
        if(x >= 0) {
            if(x == 0) flag = true;
            else flag = false;
            if (x > best) {
                best = x;
                ans = build(0, 1, 1, 0, 0, 0, 0);
            }
            else if (x == best) {
                ans = max(ans, build(0, 1, 1, 0, 0, 0, 0));
            }
        }
    }
    cout << ans << endl;
}


signed main() {
    Gamal();
    int t = 1;
    cin >> t;
    while (t--) {
        solve();
    }
}
Editor is loading...
Leave a Comment