好好好数【牛客tracker 每日一题】
2026/9/14 22:40:25 网站建设 项目流程

好好好数

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

网页链接

牛客tracker

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


题目描述

在上周的周赛 Round 57 中,双好数的构造题非常有趣。于是,在这周的周赛中,好数又回来了!但其实这两题并没有什么关系,还是重新看看题吧!

小苯有一个数字n nn,他定义k kk-好数为:可以表示为若干个不同的k kk的整数次幂之和的数字。

例如:30 = 3 3 + 3 1 30 = 3^3 + 3^130=33+31,因此30 3030是一个3 33-好数;而2 22不是一个3 33-好数(虽然有:2 = 3 0 + 3 0 2 = 3^0 + 3^02=30+30,但好数要求次幂数字不同)。

小苯有一个整数n nn,他想知道n nn最少可以被表示成几个k kk-好数的和,请你帮帮他吧。


输入描述

每个测试文件均包含多组测试数据。

第一行输入一个整数T ( 1 ≤ T ≤ 10 4 ) T\ (1 \le T \le 10^4)T(1T104),代表数据组数。

每组测试数据描述如下:

在一行上输入两个整数n , k ( 1 ≤ n ≤ 10 18 , 1 ≤ k ≤ 10 18 ) n, k\ (1 \le n \le 10^{18},\ 1 \le k \le 10^{18})n,k(1n1018,1k1018),表示小苯的数字n nnk kk-好数的k kk


输出描述

在一行上输出一个整数,代表最少可以将n nn分解成k kk-好数的个数。


示例

示例 1

输入:

2 60 3 114 514

输出:

2 114

说明:

对于第一组测试数据,30 30303 33-好数,而60 = 30 + 30 60 = 30 + 3060=30+30,因此可以分解为两个3 33-好数,可以证明不存在更优的分解方式。


数据范围与提示

解题思路

本题是进制展开与贪心分组的数学题。定义k kk-好数为若干个不同的k kk的整数次幂之和。要求将给定的n nn最少分解为几个k kk-好数之和。

1. 问题等价转化
2. 特殊情况k = 1 k = 1k=1
3. 算法实现
  1. 读入T TT组数据。
  2. 对于每组( n , k ) (n, k)(n,k)
    • k = 1 k = 1k=1,直接输出1
    • 否则,循环执行:
      • 计算n % k,记录当前余数;
      • 更新答案res = max(res, n % k)
      • n /= k
    • n变为0 00时结束,输出res
4. 复杂度分析

总结

n nn写成k kk进制后,每一位的数字代表该幂次需要出现的次数。由于每个k kk-好数在同一位最多贡献一次,最少需要的k kk-好数个数就是所有位数字的最大值。特判k = 1 k=1k=1输出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;ll n;ll k;voidSolve(){cin>>n>>k;if(k==1){cout<<"1\n";return;}ll res=0;while(n){res=max(res,n%k);n/=k;}cout<<res<<'\n';}intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);intT;cin>>T;while(T--)Solve();return0;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询