ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

简单题的逆袭【牛客tracker 每日一题】

2026/8/13 10:07:15 拓冰建站 浏览量
简单题的逆袭【牛客tracker  每日一题】

简单题的逆袭

时间限制:1 秒
空间限制:256 MB


网页链接

牛客tracker

牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每日有题做,丰盈牛币日益多!

题目描述

给定两个整数x xxy yy,找出满足方程x k ≤ y x^k \le yxky最大整数k kk


输入描述

第一行输入一个整数t ( 1 ≤ t ≤ 300 ) t\ (1 \le t \le 300)t(1t300),代表测试数据的组数。

每组输入占一行,包含两个整数x xxy yy

数据范围:0 ≤ x , y ≤ 10 18 0 \le x, y \le 10^{18}0x,y1018


输出描述

对于每个测试数据,在一行中输出一个整数k kk

k kk不存在或者无限大,则输出-1


示例

示例 1

输入:

2 2 3 0 0

输出:

1 -1

说明:


数据范围与提示

解题思路

本题要求对于给定的x xxy yy,找出最大的整数k kk满足x k ≤ y x^k \le yxky。需要注意边界情况(x = 0 , 1 x = 0, 1x=0,1y = 0 y = 0y=0)可能导致k kk不存在或无限大,根据题意这些情况应输出− 1 -11

1. 问题等价转化
2. 算法步骤
  1. 读入测试组数t tt
  2. 对于每组( x , y ) (x, y)(x,y)
    • x = 0 x = 0x=0x = 1 x = 1x=1y = 0 y = 0y=0,输出− 1 -11
    • 否则,初始化a n s = 0 ans = 0ans=0
    • y ≥ x y \ge xyx时,执行y = ⌊ y / x ⌋ y = \lfloor y / x \rfloory=y/xa n s = a n s + 1 ans = ans + 1ans=ans+1
    • 输出a n s ansans
3. 复杂度分析

总结

利用指数函数的单调性,通过连续除法快速求出最大整数k kk,同时对x ∈ { 0 , 1 } x \in \{0,1\}x{0,1}y = 0 y = 0y=0这些导致无穷解或无解的特殊情况进行特判,直接输出− 1 -11

代码简要说明

代码内容

#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll INF=1e18;constll M=1e6+10;constll mod=1e9+7;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);ll T;cin>>T;while(T--){ll a,b;cin>>a>>b;ll ans=-1;if(a==0||b==0||a==1){cout<<ans<<endl;continue;}ans=0;while(b>=a){b/=a;ans++;}cout<<ans<<endl;}return0;}