QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#640338#5117. Find MaximumPonyHexAC ✓84ms3708kbC++202.8kb2024-10-14 11:04:072024-10-14 11:04:08

Judging History

你现在查看的是最新测评结果

  • [2024-10-14 11:04:08]
  • 评测
  • 测评结果:AC
  • 用时:84ms
  • 内存:3708kb
  • [2024-10-14 11:04:07]
  • 提交

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;
}*/

详细

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