数学吧 关注:931,042贴子:8,921,044
  • 5回复贴,共1

一道关于整数的算法题

只看楼主收藏回复

有一堆苹果, 设数量为x个
输入两个整数n,k, 2≤n≤1000, 1≤k<n
将苹果平均分成n份,多出k个
取走k份和多出的k个
剩下的部分仍然可以平均分成n份,多出k个
仍然取走k份和多出的k个
剩下的部分仍然可以平均分成n份,多出k个
...
共取了n次苹果,最后剩下的苹果仍然可以平均分成n份(每份的数量可以为0),多出k个
求最小的x
原题
https://leetcode-cn.com/contest/sf-2020/problems/how-many-apples-lc/


IP属地:广东1楼2020-01-18 23:59回复
    感觉最小的x应该剩k个


    IP属地:广东2楼2020-01-19 00:04
    收起回复
      2025-12-15 17:12:41
      广告
      不感兴趣
      开通SVIP免广告
      先数列思想人脑推理下:
      数列递推公式:a(0)=x;a(i+1)=(n-k)(a(i)-k)/n
      得到数列{a(i)-k(n-k)/(2n-k)}必为等比数列,公比为(n-k)/n
      故通项a(i)=[x-k(n-k)/(2n-k)][(n-k)/n]^i +k(n-k)/(2n-k)
      要求至少可以取n次,那也就是说a(0)到a(n)必须都是整数,那么通分后分母必须能被约分。注意其中最大的分母也就是a(n)的是(2n-k)n^n,那么只要保证a(i)是整数即可


      IP属地:辽宁4楼2020-01-19 10:08
      回复
        通项是不是算错了


        IP属地:湖北来自Android客户端5楼2020-01-19 11:44
        回复
          从算法而非数学的角度看,就是一个遍历尝试即可
          设置一个参数a,从0开始,代表了最后一步分成n份以后每份有a个,然后可以算出最后一步总共剩(na+k)个,那么如果na+k是n-k的倍数,则他可以由上一步推下来,上一步每份的数量就是(na+k)/(n-k)个,以此类推,如果能尝试成功n次,则找到解并结束,否则就宣告失败,a+=1
          中间可以做一些剪枝优化,比如在一波尝试失败后,可以将过程中的结果存储到一个hashset里,表示这些数再往上推肯定失败,那么之后遇到这些数就不用再次尝试了
          这应该是最直观的一个思路吧,时间效率不一定是最好的


          IP属地:北京6楼2020-01-19 12:06
          回复