P11130 解题报告

场外选手口胡

题目传送门

题目大意:

T 组询问,每次给定两个正整数 a,b

定义一种操作为:选择一个正整数 y,将 x 变成 x×gcd(a,y)

对每组询问回答:将 a 变成 y 最少需要几次操作。

数据范围:1T2×105,1ab1018

思路:

读完题确定思考方向应该是选择一种策略使得每次 a 的增长尽量大,考虑贪心。

考虑到 gcd(a,y) 是整数,所以首先判掉一种无解情况:当 ab 时,必定无解。

接着令 c=ab

因为操作中的 y 是自己指定的,所以 a 每次扩大的倍数和它自己的质因子及其指数相关,我们想让它扩大的幅度尽量大,就得每次尽量选择它和 c 的质因子重合的尽量多的质因子,即 gcd(a,c)

通俗来讲就是每次尽量增大一点,多囊括一点质因数,在更靠近目标的过程中顺便拥有更多的选择权。

所以做法就是每次求出 d=gcd(a,c),然后 aa×dccd,直到 a=b

在此过程中还要判断 d 是否为 1,若 d=1ab,那么就不可能成功了,因为此时 c存在被垄断的质因子

以上都为感性理解,接下来开始严谨(可能不那么严谨)证明。

这里从决策包容性来证明。

从质因数分解的方向来思考。

在操作进行的任意时刻,设

a=p1α1×p2α2××pkαk

d=gcd(a,c),是最优策略 y 所产生的贡献,d 为选择另外一个 y 带来的贡献,且 d<d

d=p1a1p2a2pkak

d=p1b1p2b2pkbk

因为 d<d,所以 i[1,k],biai,并且 i[1,k],bi<ai.

按两种方式将 a 操作之后分别得到:

a=p1α1+a1×p2α2+a2××pkαk+ak

a=p1α1+b1×p2α2+b2××pkαk+bk

所以 i[1,k],αi+bi<αi+ai.

接着考虑这一次操作对下一次操作的影响。

设从 a 中取出来若干质因数组成的集合 S={n1p1,n2p2nkpk},是由 n1p1n2p2,,nkpk 组成的多重集,其中 i[1,k],0niαi+ai

同理可设从 a 中取出来若干质因数组成的集合 S={n1p1,n2p2nkpk},是由 n1p1n2p2,,nkpk 组成的多重集,其中 i[1,k],0niαi+bi

定义 t 为下一次操作选择 yN 可产生的贡献,从 S 中选择产生的所有 t 值组成不可重集合 S1,从 S 中选择产生的所有 t 值组成不可重集合为 S2

由于 i[1,k],αi+bi<αi+ai,所以容易得出 S2S1

所以选择乘上 d 后未来能做到的,选择乘上 d 后未来也能达到,即 d 的的适用性更广

因此在任意局面下,做出局部最优解后,这个局部最优策略提供的可能性包含其他所有的策略提供的可能性,此贪心策略是正确的。

证毕。

同时,再此贪心策略下,每次 a 至少要乘二,所以时间复杂度为 O(Tlogb)

Code:

#include <iostream>

using namespace std;
typedef long long ll;
int T;
ll a, b;

ll gcd(ll a, ll b) {
    if(!b) return a;
    return gcd(b, a % b);
}

void solve() {
    scanf("%lld%lld", &a, &b);
    if(b % a != 0) {
        puts("-1");
        return ;
    }
    ll c = b / a;
    if(c % a != 0) {
        puts("-1");
        return ;
    }
    int res = 0;
    while(a != b) {
        ll d = gcd(a, c);
        a *= d, c /= d;
        ++res;
    }
    printf("%d\n", res);
}

int main() {
    scanf("%d", &T);
    while(T--) {
        solve();
    }
    return 0;
}
posted @   Brilliant11001  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示