网赛第一个看的就是这题,直接打表找规律。很容易发现是由大于4的的偶数以及奇数的平方,再除去偶数的平方所组成。一开始犯了个比较2的错误,要不然应该是FB了。。
也没有去推为什么是这样,这种题目一般都是先打表找下规律,一发现规律就懒的去推了。。
直接sqrt是有精度问题的,但是G++能A,C++是WA,比较简单的办法是sqrt后再通过乘法调整一下。
1 #include <string.h> 2 #include <stdio.h> 3 #include <math.h> 4 typedef long long LL; 5 int cas; 6 LL l,r; 7 LL get(LL x){ 8 if(x<=5)return 0; 9 LL xx=sqrt((double)x); 10 //有精度问题,调整一下(没有这句G++AC,C++WA..) 11 while(xx*xx<=x)xx++;xx--; 12 return x/2+(xx+1)/2-xx/2-2; 13 } 14 int main(){ 15 scanf("%d",&cas); 16 while(cas--){ 17 scanf("%I64d%I64d",&l,&r); 18 printf("%I64d\n",get(r)-get(l-1)); 19 } 20 return 0; 21 }