Problem Description
定义f(x) = {比x小,不可以被x整除并且不和x互质的数的个数}(x为正整数)。
当f(x) 是奇数的时候我们称x为“奇真数”。
给出两个数x,y求区间[x,y]内的“奇真数”的个数。
Input
第一行输入一个数N代表测试数据个数(N<=20)。接下来N行每行两个正整数x , y ( 0 < x <= y < 2^31)。
Output
对于每个测试数据输出“奇真数”的个数,每行输出一个结果。
Sample Input
2 1 1 1 10
Sample Output
0 4
误:
这个题,题目描述有点问题,举个栗子:5比20小,5还能被20整除?所以开头那一句应该是不可以整除x。
(这题只做java练习而放这里不大合适...做比赛题的话还说得过去,拿来考试现做的话就不大现实了,只能是背下来...)
思路:
(脑子不够使得...还是写一下逻辑结构)
1.分析题目:此f(x)非上面所指
①在x某范围内,f(x)运算结果为true的个数如果是奇数,计数器++。
②计算f(x):设符合(我们要找个数的)数的条件为i,那么,不可整除x:i不是x的约数;不与x互质:i与x有公约数
2.要在所有数中排除这两种情况。
3.两种情况是否有交集?如果3是6的约数,那么3与6有本身作为公约数,于是i与x不互质。所以没有交集。f(x)=x-互质-约数+1
4.具体讨论两种情况如何实现,这一步骤在大佬这讲得很清楚了:https://blog.csdn.net/tclh123/article/details/7970545
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int n=s.nextInt();
long x,y;
while(n-->0)
{
x=s.nextInt();
y=s.nextInt();
System.out.println(f(y)-f(x-1));
}
s.close();
}
static long f(long a)
{
if(a<=2)
return 0;
if((long)Math.sqrt(a)%2==1)
return a/2-1;
else
return a/2-2;
}
}