QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#640332 | #5117. Find Maximum | PonyHex | WA | 1ms | 3612kb | C++20 | 2.8kb | 2024-10-14 11:03:00 | 2024-10-14 11:03:01 |
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);
}
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: 3572kb
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: -100
Wrong Answer
time: 1ms
memory: 3612kb
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:
wrong answer 491st numbers differ - expected: '4', found: '5'