题目描述
牛牛以前在老师那里得到了一个正整数数对(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);
}
}