题目描述
牛牛以前在老师那里得到过一个整数对(x,y),牛牛忘记他们具体是多少了,只记得老师说过,x和y均不大于n,且x%y不小于k,牛牛希望你能帮他计算一共有多少种可能的整数对。
输入描述:两个整数n,k。其中1<=n<=10^5, 0<=k<=n-1
输出描述:输出可能的正整数对的个数。
思路:
暴力破解所有整数对,需要o(n^2),会超时。
其实是个数学问题:
1. y必然大于k,x必然不小于k,才可能产生不小于k的余数;
2.x一定可以表示为:x = i*y + k' (0<x<= n) ,其中i可以理解为倍数,(0<= i < n/y,共n/y个可能的i),k'为(k,y-1)之间的任意数,共(y-k)种;所以一共有(n/y)*(y-k)种情况。
3.当i取到n/y时,x = i*y + k'可能大于n,所以要计算这里面可能出现的,不大于n的情况,即max(0, n- ( i*y+ k) ));
针对以上三个问题,可以大大简化计算的复杂度。
代码:
import java.util.*;
public class Main {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int k = scanner.nextInt();
int y = 1;
int factor = 1;
long sumCnt = 0;
if(k == 0) {
System.out.println(n*n);
}
for(y = k + 1; y <= n; y++) {
factor = n / y;
sumCnt += factor * (y - k);
sumCnt += Math.max(0, n - (factor * y + k) + 1);
}
System.out.println(sumCnt);
}
}