QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#640338 | #5117. Find Maximum | PonyHex | AC ✓ | 84ms | 3708kb | C++20 | 2.8kb | 2024-10-14 11:04:07 | 2024-10-14 11:04:08 |
Judging History
answer
#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define double long double
//#define int long long
#define lc u<<1
#define rc u<<1|1
#define endl "\n"
#define X first
#define Y second
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int, int> PII;
const ll N = 1e6 + 50;
const ll maxm = 2e18;
const ll mod = 998244353;
ll exgcd(ll a, ll b, ll& x, ll& y);
ll dfs(ll x) {
if (x == 0)return 1;
if (x > 0 && x % 3 == 0)return dfs(x / 3) + 1;
if (x > 0 && x % 3 != 0)return dfs(x - 1) + 1;
}
ll base[50];
ll ksm(ll a, ll b) {
ll base = a;
ll ans = 1;
while (b) {
if (b & 1)ans *= base;
base *= base;
b >>= 1;
}
return ans;
}
void solve()
{
//复盘一下,化为三进制后,我们观察所有第一次出现的元素的三进制发现,
//他比前置元素都大,而他的三进制最后的几位全部是2,猜测,越放2越优
//观察题目中给的式子,在三进制尺度下,我们发现,三进制每个位置上的数字越大
//获取操作三的次数越多,加1越多,第二个操作本质是右移操作
//除三操作,这意味着我们一直向前找比r小的元素,然后再某一位减1
//对后面全赋二,这样就找到更优的一种情况,
//cout << ksm(3, 50) << endl;
ll l, r; cin >> l >> r;
for (int i = 0; i <= 49; i++)base[i] = 0;
ll idx = -1, midd = r;
while (midd) {//完,先得到的是最高位
base[++idx] = midd % 3;
midd /= 3;
}
/*
for (int i = 0; i <= idx; i++)cout << base[i];
cout << endl;*/
ll ans = dfs(r); ll cnt = 0;
for (ll i = 0; i<=idx; i++) {
ll mid = r;
if (base[i] == 0) {
cnt++;
continue;
}
mid -= ksm(3, cnt);
for (ll j = 0; j < cnt; j++) {
mid += 2 * ksm(3, j);
mid -= base[j] * ksm(3, j);
}
if(mid>=l)
ans = max(ans, dfs(mid));
//cout <<mid<<" "<< dfs(mid) << endl;
cnt++;
}
cout << ans << endl;
return;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
ll t = 1; cin >> t;
while (t--)solve();
return 0;
}
/*PonyHex*/
ll exgcd(ll a, ll b, ll& x, ll& y) {
if (b == 0) {
x = 1; y = 0;
return a;
}
ll g = exgcd(b, a % b, x, y);
ll temp = x;
x = y;
y = temp - (a / b) * y;
return g;
}
/*
1
11
1 2 3 2 5 6 7 6 9 1
*/
/*
ll ksm(ll a, ll b) {
ll base = a;
ll ans = 1;
while (b) {
if (b & 1)ans *= base;
base *= base;
b >>= 1;
}
return ans;
}*/
/*
ll gcd(ll a, ll b) {
return b ? gcd(b, a % b) : a;
}*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3708kb
input:
10 1 2 1 3 1 4 1 5 2 3 2 4 2 5 3 4 3 5 4 5
output:
3 3 4 5 3 4 5 4 5 5
result:
ok 10 numbers
Test #2:
score: 0
Accepted
time: 1ms
memory: 3588kb
input:
5050 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 1 22 1 23 1 24 1 25 1 26 1 27 1 28 1 29 1 30 1 31 1 32 1 33 1 34 1 35 1 36 1 37 1 38 1 39 1 40 1 41 1 42 1 43 1 44 1 45 1 46 1 47 1 48 1 49 1 50 1 51 1 52 1 53 1 54 1 55 1 56 1 57 1 58 1 59 1 60 1 61...
output:
2 3 3 4 5 5 5 6 6 6 6 6 6 7 7 7 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 3 3 4 5 5 5 6 6 6 6 6 6 7 7 7 8 8 8 8 8 8 8...
result:
ok 5050 numbers
Test #3:
score: 0
Accepted
time: 84ms
memory: 3652kb
input:
10000 2924776299390853 348932224550662831 638290869233943020 897334616745111026 210780034220004669 279345354637770906 20574264013277469 387573622060864735 39441497975868873 806211034038773415 19845198891021950 243636832211738144 298454268109304380 988142879006387197 613847475002049291 86666797163210...
output:
110 112 109 110 112 108 113 112 110 107 109 113 110 111 111 111 109 108 111 113 111 111 113 112 111 110 111 108 111 110 111 111 112 111 113 109 111 110 108 111 111 113 110 110 110 112 110 107 111 111 109 107 112 111 110 111 112 111 111 112 111 111 109 111 110 111 112 111 113 110 113 112 112 110 110 ...
result:
ok 10000 numbers
Test #4:
score: 0
Accepted
time: 1ms
memory: 3660kb
input:
144 3 8 2 8 2 9 3 9 9 26 8 26 8 27 9 27 27 80 26 80 26 81 27 81 81 242 80 242 80 243 81 243 243 728 242 728 242 729 243 729 729 2186 728 2186 728 2187 729 2187 2187 6560 2186 6560 2186 6561 2187 6561 6561 19682 6560 19682 6560 19683 6561 19683 19683 59048 19682 59048 19682 59049 19683 59049 59049 17...
output:
6 6 6 6 9 9 9 9 12 12 12 12 15 15 15 15 18 18 18 18 21 21 21 21 24 24 24 24 27 27 27 27 30 30 30 30 33 33 33 33 36 36 36 36 39 39 39 39 42 42 42 42 45 45 45 45 48 48 48 48 51 51 51 51 54 54 54 54 57 57 57 57 60 60 60 60 63 63 63 63 66 66 66 66 69 69 69 69 72 72 72 72 75 75 75 75 78 78 78 78 81 81 81...
result:
ok 144 numbers