题目描述
给定 L,R,问 L≤x≤R 中有多少个数 x 满足存在整数 y,z 使得 x=y^2−z^2。
输入格式
输入一行包含两个整数 L,R,用一个空格分隔。
输出格式
输出一行包含一个整数满足题目给定条件的 x 的数量。
输入输出样例
输入 #1复制
1 5
输出 #1复制
4
说明/提示
【样例说明】
- 1=1^2−0^2
- 3=2^2−1^2
- 4=2^2−0^2
- 5=3^2−2^2
【评测用例规模与约定】
对于 40% 的评测用例L,R≤5000;
对于所有评测用例,1≤L≤R≤10^9。
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int l = scanner.nextInt();
int r = scanner.nextInt();
int count1 = odd(l - 1) + four(l - 1);
int count2 = odd(r) + four(r);
System.out.print(count2 - count1);
}
public static int odd(int n) {//计算奇数个数
if(n % 2 != 0) return (n + 1) / 2;
else return n / 2;
}
public static int four(int n) {//计算4的倍数的个数
return n /4;
}
}
题目分析:由数学公式可知y^2 - z^2 = (y+z)(y-z),那么可以将x = y^2 - z^2写做x = a*b且a,b的奇偶性相同,那么可知如果x可以被分解为奇偶性相同的两个数,则x一定满足题意。当x为奇数时可以被分解为1和x,两个都是奇数,因此所有奇数满足题意;若要将x分解为两个偶数的乘积,那么x定为4的倍数。