HDU 4279 Number-------找规律题

Number

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2159    Accepted Submission(s): 614


Problem Description
  Here are two numbers A and B (0 < A <= B). If B cannot be divisible by A, and A and B are not co-prime numbers, we define A as a special number of B.
  For each x, f(x) equals to the amount of x’s special numbers.
  For example, f(6)=1, because 6 only have one special number which is 4. And f(12)=3, its special numbers are 8,9,10.
  When f(x) is odd, we consider x as a real number.
  Now given 2 integers x and y, your job is to calculate how many real numbers are between them.
 

 

Input
  In the first line there is an integer T (T <= 2000), indicates the number of test cases. Then T line follows, each line contains two integers x and y (1 <= x <= y <= 2^63-1) separated by a single space.
 

 

Output
  Output the total number of real numbers.
 
Sample Input
2
1 1
1 10
Sample Output
0
4
 
这道题,同样的没有思路的题目。
有的人说,1000ms,题目复杂,就想到是找规律了。这规律.....。
1->x : ans
            1-1:0
            1-2:0
            1-3:0
            1-4:0
            1-5:0//x小于等于5之前都是0。5/2-2 = 0
            1-6:1//x是某个数的平方和,且k为偶数。则不变 6/2-2 = 1;
            1-7:1//x是某个数的平方和,且k为偶数。则不变 7/2-2 = 1;
            1-8:2    
            1-9:3//x是某个数k的平方和,且k为奇数。加1  9/3-2 + 1 = 3;
            1-10:4
            1-11:4
            1-12:5
            1-13:5
            1-14:6//x是某个数k的平方和,且k为奇数。加1  14/2-2 + 1 = 6;
            1-15:6
            1-16:6//x是某个数k的平方和,且k为偶数。则不变  16/2-2 = 6;
            1-17:6
            1-18:6
            1-19:7
            1-20:8
            1-21:8
            1-22:9
            1-23:9
            1-24:10
            1-25:11//x是某个数k的平方和,且k为奇数。加1   25/2 -2 + 1 = 11;
            1-26:12
还有考虑区间的问题求的是[n,m]=[1,m]-[1,n-1];
 1 /*

 2 我只能说,以后遇到复杂度高,

 3 时间小的题目

 4 找规律是一种切入方式

 5 

 6 */

 7 

 8 #include<stdio.h>

 9 #include<math.h>

10 #include<stdlib.h>

11 

12 __int64 make_ini(__int64 num)

13 {

14     __int64 tmp=num;

15     if(num<6)

16     return 0;

17     tmp=(num>>1)-2;

18     num=(__int64)sqrt(num*1.0);

19     if(num%2==1)

20     tmp++;

21     return tmp;

22 }

23 

24 int main()

25 {

26     __int64 T,n,m;

27     while(scanf("%I64d",&T)>0)

28     {

29         while(T--)

30         {

31             scanf("%I64d%I64d",&n,&m);

32             printf("%I64d\n",make_ini(m)-make_ini(n-1));

33         }

34         return 0;

35     }

36     return 0;

37 }

 

你可能感兴趣的:(number)