牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对。
牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
牛牛希望你能帮他计算一共有多少个可能的数对。
输入包括两个正整数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)
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); final long n = sc.nextInt(); final long k = sc.nextInt(); if (k == 0) { System.out.println(n * n); return; } long result = 0; for (long y = k + 1; y <= n; y++) { long count = n / y; result += (y - k) * count + ((n % y) >= k ? n - count * y - k + 1 : 0); } System.out.println(result); } }
思路:将区间[1, n]切分为[1,y,2y...iy,n],其中i=n/y。可知在前面i段中,每段有y-k个值满足x的要求。最后一段区间[iy, n]做特殊处理即可。最后,将y做循环,就能找出所有满足要求的数对量啦。
import java.util.*; public class Main { public static void main(String[] args) {
Scanner sc = new Scanner(System.in); int n = sc.nextInt(),k = sc.nextInt(); int count = 0,count1 = 0; if (k == 0)
count = n * n; else { for (int i = k + 1;i <= n;i++){
count += (n / i) * (i - k); if (n % i >= k)
count += n % i - k + 1; }
}
System.out.println(count); }
}
思路:
x % y = k+,则x = y z + k+,遍历y计算x的可能情况。
保证y > k,除数大于余数。
对于每一个特定的y,
xMin = y factor + k
xMax = Math.min(y * (factor + 1) - 1, n)
其差值即为当前y下x的取值,累加即可。
注意:
1.参数的取值,本题xy均为正数,k>=0,故存在x等于0的情况,去除之。
2.除数大于余数,y从k+1开始。
3.累加值小于答案时,考虑是否累积了负值。
import java.util.Scanner;
public class NumberPair {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int k = in.nextInt();
long count = 0;
for (int y = k + 1; y <= n; y++) {
int factor = 0;
while (true) {
int xMin = y * factor + k;
xMin = xMin == 0 ? 1 : xMin;
if (xMin > n) {
break;
}
int xMax = Math.min(y * (factor + 1) - 1, n);
count += xMax - xMin + 1;
factor++;
}
}
System.out.println(count);
in.close();
}
}
def solution(n,k)->int: if k==0: return (n**2) else: flag=0 for y in range(k+1,n+1): arry=n//y # 分组共有n//y组 # 固定y,求满足要求的x个数 # 计算对每组y有多少x满足要求 # 根据第一组,y>x>=k时满足,共y-k个 flag+=arry*(y-k) if n%y!=0: tmp=n-y*arry # 计算有多少个剩余 tmp1=tmp-k+1 # 计算剩余中有多少满足x要求 if tmp1>0: flag+=tmp1 return flag n,k = map(int,input().split()) num = solution(n,k) print(num)
package com.jerehao.playground; import java.util.Scanner; public class No2 { private static int n; private static int k; private static long res = 0; public static void main(String[] args){ int loop = 1; System.setIn(No2.class.getResourceAsStream("2.txt")); Scanner scanner = new Scanner(System.in); //loop = scanner.nextInt(); for (int i = 0; i < loop; ++i) { n = scanner.nextInt(); k = scanner.nextInt(); solve(); output(); } scanner.close(); } private static void solve() { if(k == 0) { res = n * (long)(n); return; } int t, b; for(b = k + 1; b <= n; ++b) { t = (n - k) / b; res += t * (b - k) + Math.min(n, t * b + b - 1) - (t * b + k) + 1; } } private static void output() { System.out.println(res); } }