Untitled
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