题目:
牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对。
解析:
一开始直接两个循环,结果代码复杂度太高了,运行超时。然后就开始冥思苦想找规律,也没找着,最后还是借鉴的别人的思路。
比较难理解的就是这两句代码:
count += Math.floor(n/y)*(y-k);
count += n%y-k+1;
首先,y的取值是从k+1到n的。从y到n一共有多少个数呢?我们可以这么想,n个数可以划分为长度为y的若干段。[1,y] , [y+1,2y] , [2y+1,3y] ……[my,n]。前面的m段的长度都是y,后面的长度为n个数处以y的余数n%y。
m为多少呢?n/y向下取整。
其中,每一段又有k个数是小于等于k的,也就是相除余数小于等于k。那么大于等于k的就是y-k。所以前面的m段中有Math.floor(n/y)*(y-k)对数。
最后一段比较特殊,当他的长度小于k时,不用说,除以k余数肯定小于k。所以余数大于k的就n%y-k+1。
var arr = readline().split(' ');
var n = parseInt(arr[0]);
var k = parseInt(arr[1]);
count = 0;
function main(n,k){
if(k===0){
count=n*n;
}else{
for(var y=k+1;y<=n;y++){
count += Math.floor(n/y)*(y-k);
if(n%y >=k){
count += n%y-k+1;
}
}
}
print(count);
}
main(n,k);