2019校招真题编程练习 - 5 - 数对

题目描述

牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对。

输入描述

输入包括两个正整数n,k(1 <= n <= 10^5, 0 <= k <= n - 1)。

输出描述

对于每个测试用例, 输出一个正整数表示可能的数对数量。

示例

输入
5 2

输出
7

说明
满足条件的数对有(2,3),(2,4),(2,5),(3,4),(3,5),(4,5),(5,3)

思路

当k=0时,任何一对的余数都大于0。所以一共有nn对。
x<=n, y<=n;
x%y >= k;
y必须大于等于k+1
x%y的范围是[0,y-1] 其中大于等于k的范围是[k,y-1]一共有(y-k)个
x在[1,n] 一共有区间一共有n/y个循环,所以一共有(n/y)
(y-k)个
剩下的余数中,如果n%y大于等于k 就把k到n%y中加到count里

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        long n = in.nextInt();
        long k = in.nextInt();
        if(n<1 || n>100000 || k<0 || k>n-1){
            return ;
        }
        long count = 0L;
        /**枚举方法 时间复杂度过高 通过率只有10%
        for(int x=k; x<= n; x++){
            for(int y=k+1; y<=n; y++){
                if((x%y)>=k)
                    count++;
            }
        }**/
        if(k == 0)
            count = n*n;
        else{
            for(long y=k+1; y<=n; y++){
                count += (n/y) * (y-k);
                if(n%y>=k){
                    count += (n%y - k + 1);
                }
            }
        }
        System.out.println(count);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值