Untitled
unknown
plain_text
10 months ago
3.4 kB
18
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