首页 > 其他分享 >题解:P11063 【MX-X4-T3】「Jason-1」数对变换

题解:P11063 【MX-X4-T3】「Jason-1」数对变换

时间:2024-10-14 18:49:41浏览次数:1  
标签:le Jason 变换 题解 数对 long times 操作

Problem Link

【MX-X4-T3】「Jason-1」数对变换

题外话

场上把贪心注重在一个奇怪地方了,导致交的时候已经有 \(9\) 个人 \(\textcolor{green}{AC}\) 了(哭)。

题意简述

对于数对 \((x,y)\),你可以执行以下两种变换:

  • 类型 1:取 \(1 \le k \le x\),令 \((x,y) \gets (\lfloor \frac{x}{k} \rfloor, y \cdot k)\)。
  • 类型 2:取 \(1 \le k \le y\),令 \((x,y) \gets (x \cdot k, \lfloor \frac{y}{k} \rfloor)\)。

显然,变换后的数对仍然是正整数数对。

给出两组正整数数对 \((a, b)\) 与 \((c, d)\),你需要执行不超过 \(\bm{65}\) 次变换将 \((a, b)\) 变为 \((c, d)\),或者报告无解。注意:你不需要最小化执行变换的次数

Solution

不难发现,当 \(\dfrac{a}{c}=\dfrac{d}{b}\) 即 \(a \times b = c \times d\) 时,最多两步操作即可完成数对变换,我们称 \(a \times b = c \times d\) 的状态为“最终态”。

手玩一些数据之后,显然操作 \(1\) 和操作 \(2\) 本质一样,同时操作 \(1\) 与操作 \(2\) 必然是交替进行(因为多次操作 \(1\) 亦或是多次 \(2\) 都可以并为一次操作)。

因为操作 \(1\) 和操作 \(2\) 本质无差别,故后文将以“操作”代替操作 \(1\) 或操作 \(2\),同时默认操作是类型 \(1\)。

推论:每次非进入最终态的操作必定化为使数对 \((a, b)\) 变成形如 \((x, 1)\) 的形式,且操作的 \(k\) 值为 \(a/2+1\) 或 \(b/2+1\)。

证明

首先,若一次操作之后进入最终态,本轮操作就大部分解决了,所以我们要尽量进入最终态,也就是说 \(a \times b\) 要尽量接近 \(c \times d\)。

思考一次操作能为我们带来多大的贡献。

假设对数对 \((a, b)\) 进行操作,取 \(k\) 值为 \(k\),设:

\[ a = p \times k + q (0 \le q < k)。 \]

则操作结束后数对 \((a, b)\) 将变成数对 \((p, b \times k)\),数对之积减少了 \(b \times q\)。

\(b\) 为定值,则要使 \(q\) 尽量大

发现 \(q\) 在 \(k = a/2+1\) 取最大值,此时 \(p\) 为 \(1\)。

证毕。

之后的思路就清晰起来了:每次对于数对 \((a, 1)\),若无法使其一次进入最终态(即 \(a \ge (2 \times c \times d)\)),就进行操作直到进入最终态。

其他疑问见代码。

代码

// written by Naught
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
// #define int long long
#define Maxn 105
#define p2(x) ((x)*(x))
#define fo(i, l, r) for (int i = l; i <= r; ++i)
#define fr(i, r, l) for (int i = l; i >= r; --i)
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21], *p1 = buf, *p2 = buf;
inline int read(int x=0, bool f=0, char c=getchar()) {for(;!isdigit(c);c=getchar()) f^=!(c^45);for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);return f?-x:x;}
inline ll lread(ll x=0, bool f=0, char c=getchar()) {for(;!isdigit(c);c=getchar()) f^=!(c^45);for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);return f?-x:x;}
// void train() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);}

struct ope
{
    int op;
    ll k;
}ans[Maxn];
ll cnt;

void print()
{
    printf("%lld\n", cnt);
    fo(i, 1, cnt) printf("%d %lld\n", ans[i].op, ans[i].k);
}

int main()
{
    int _ = read();
    while(_--)
    {
        ll x = lread(), y = lread(), c = lread(), d = lread(); cnt = 0;
        if(x == c && y == d) {puts("0");continue;}
        if(x * y < c*d ) {puts("-1");continue;}
        int tmp = 2;
        ans[++cnt] = {tmp, y}; x *= y, y = 1, tmp = 3-tmp;
        while(x*y >= 2*c*d && cnt <= 63)
        {
            ll k = x*y/2+1;
            ans[++cnt] = {tmp, k};
            if(tmp == 2) y /= k, x *= k;
            else x /= k, y *= k;
            tmp = 3-tmp;
        }
        if(cnt == 64 && x*y != c*d) {puts("-1"); continue;}
        ans[++cnt] = {tmp, c*d}; tmp = 3-tmp;
        ans[++cnt] = {tmp, tmp == 1? d: c};
        print();
    }
    return 0;
}

Tips

\(10^9 \times 10^9\) 会爆 int,记得开long long

标签:le,Jason,变换,题解,数对,long,times,操作
From: https://www.cnblogs.com/naughty-naught/p/18464767

相关文章

  • 题解:P10370 「LAOI-4」Mex Tower (Hard ver.)
    ProblemLink「LAOI-4」MexTower(Hardver.)题意给定一个长度为$n$的序列$a$,求序列的$\operatorname{Mex}$值是否大于等于其他所有长度为$n$的自然数序列的$\operatorname{Mex}$值。Solution不难发现,两个数或一个序列的$\operatorname{Mex}$一定是......
  • 题解:擬二等辺三角形
    ProblemLink擬二等辺三角形题面翻译定义一个三角形为“伪等腰三角形”需满足以下三个条件:三边长度都为自然数。三边长度各不相同。有其中两条边的长度之差为\(1\)。现在给你一个数\(n\),求周长小于等于\(n\)的“伪等腰三角形”个数,答案对\(1000000007\)取模......
  • 题解:AT_abc370_c [ABC370C] Word Ladder
    题目传送门luogu观看简要题意给两个序列\(S\)和\(T\),输出的第一个数是它能改变的总个数,后面跟着的第\(i\)个是改变\(i\)个数之后,字典序最小的结果。思路当\(S\)与\(T\)相等的话,那就无法改变了,直接输出\(0\)。对于总数只要\(T_i\neS_i\)那它就可以改,所以只......
  • 题解:P1660 数位平方和
    ProblemLinkStep1:“定义\(S(n)\)表示\(n\)个的各个数位的\(k\)次方的和。”数位的\(k\)次方,我们可以通过快速幂求出,为了节省时间,我们可以定义一个\(a\)数组,来表示\(0\sim9\)区间中各数字\(k\)次方的值。然后我们通过定义一个\(s\)数组来存储\(0\sim4\times......
  • 题解:P7356 「PMOI-1」游戏
    ProblemLink「PMOI-1」游戏题意给你一个胜利规则为黑白白白的棋类游戏,你执白,黑先行且第一步必下\((0,0)\),双方皆可放弃落子且落子坐标必须为自然数,请在4步内获胜。思路在自己与自己对下几局之后,有几个显然的发现:黑棋会尽量阻止你4步获胜。在你不会再下一步就获......
  • 题解:AT_agc027_b [AGC027B] Garbage Collector
    ProblemLink[AGC027B]GarbageCollector题意原题翻译已经很不错了,这里不再赘述。思路推论:每次取的垃圾数量应尽可能均分。证明如图,假设有\(4\)个垃圾需要被捡起,有两种取法:取一号垃圾+取二三四号垃圾。取一二号垃圾+取二三号垃圾。前者所需能量为:\(\display......
  • [2024领航杯] Pwn方向题解 babyheap
      [2024领航杯]Pwn方向题解babyheap前言:当然这个比赛我没有参加,是江苏省的一个比赛,附件是XiDP师傅在比赛结束之后发给我的,最近事情有点多,当时搁置了一天,昨天下午想起来这个事情,才开始看题目,XiDP师傅说是2.35版本的libc,确实高版本libc的却棘手,我经验太浅了调试半天,最后让我们......
  • CF360B题解
    简述题意定一个数列\(a\),可以对其中的元素做至多\(k\)次修改,每次修改可以将数列中的一个数改成另一个。求经过修改后,\(max_{i=1}^{n}|a_i-a_{i-1}|\)思路考虑二分答案,对于check函数,我们可以利用dp进行求解。由于修改不太好想,我们可以把问题转换为让不被修改的数最多......
  • CF1814B. Long Legs 题解 枚举
    题目链接:https://codeforces.com/problemset/problem/1814/B题目大意有一个无限大的二维平面,我们用\((x,y)\)来表示平面中横坐标为\(x\)纵坐标为\(y\)的那个位置。一个机器人被放置在该二维平面的\((0,0)\)位置中。该机器人的腿长可以调节。最初,它的腿长为\(1\)。......
  • 【题解】Solution Set - NOIP2024集训Day50 图的连通性相关
    【题解】SolutionSet-NOIP2024集训Day50图的连通性相关https://www.becoder.com.cn/contest/5618「JSOI2012」越狱老虎桥简述题意:题目大意:给定一张图,A先添加\(1\)条边,B再删去一条边使得图不连通,A要最大化删除边的权值,B要最小化删除边的权值,问最终的权值是多少。......