网易2019实习生招聘编程题之数对

文章目录

  • 限制
时间限制:1秒  空间限制:32768K
  • 题目描述
牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对。
  • 输入描述
输入包括两个正整数n,k(1 <= n <= 10^5, 0 <= k <= n - 1)。
  • 输出描述
对于每个测试用例, 输出一个正整数表示可能的数对数量。
  • 示例1
输入: 5 2
输出: 7
说明: 满足条件的数对有(2,3),(2,4),(2,5),(3,4),(3,5),(4,5),(5,3)
  • 分析
  1. 首先想到的肯定是枚举法,但对于n < =100000来说,肯定会超过时间的限制
  2. 考虑条件x除以y的余数大于等于k,所以除数y∈[k+1,n]y\in[k+1,n]y[k+1,n]
  3. 假设 x是[0,n]之间的任意值,那么在这段区间至少可以分成n/y个完整的,长度为y的区间:x = [1……y-2,y-1,y] [y+1,……,2y-1,2y]……[……]…… [……,n],在每个区间上,除以y的余数分别是1,2,······,y-1,0,满足x除以y的余数大于等于k的有y-k个;对于最后一段,长度可能不够y,计算该区间上满足条件的个数为:n%y-k+1
  • 具体如下:
    如示例1:n=5,k=2
  1. 由于x除以y的余数大于等于k,所以y=3,4,5
  2. y=3,x被分为[1,2,3] [4,5] 5%3 =1个完整区间 每个区间内有y-k=3-2=1个满足条件,对于最后一段区间长度不够y=3,用n%y-k+1=5%3-2+1=1个满足条件;
  3. 同理y=4 有n%y*(y-k)+n%y-k+1=5%4*(4-2)+5%4-2+1=2个满足条件;
  4. y=5 ,没有不完整段,所以有n%y*(y-k)=5%5*(5-2)=3个满足条件;
    综上:共有7个满足条件;
  • 代码
if __name__ == "__main__":
    n,k = map(int,input().split())
    count = 0
    if k == 0: # k = 0是一种特殊情况
        count = n * n
    else:
        for i in range(k+1,n+1):
            count += (n // i) *(i - k) + max(0,(n % i) - k +1)  
       #此处需注意 如果用以下代码代替会出现错误情况,如k = 4, n = 5时,5 % 4 - 4  + 1 = -4 ,此时最后一段满足的个数为0,而不会是复数
      #  for i in range(k+1,n+1):
            #count += (n // i) *(i - k)
           # if n % i != 0:
               # count = count + (n % i) - k + 1
    print(count)
  • 结果
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值