題目描述
首先定義"special number":
如果對於一個數字B,存在一個數字A(0<A<=B),並同時滿足 B%A=0 和 gcd(A,B) != 1 ,那麼我們就說A是B的"special number"。
再定義一個函數f(x)表示x的"special number"的數量。並且如果f(x)%2=1時,我們就稱x爲"real number"。
現在給你兩個數字x和y且1<=x<=y<=2^63-1,求再[x,y]區間內"real number"的數量。
分析:
看到範圍後,這題第一眼就打表有木有,然後自己拿着數據去YY.......,然後就搞定。
然而就是掛掉了。最後發現竟然在開方這裏。
賽後試了下,如果這樣: ans = sqrt(n) 就過不了
如果改成:ans = sqrt((long double)n) 就過了
然後本人手賤又嘗試了一下這個:ans = sqrt((double)n) 還是過不了
難道long double 和 double 不是一個東西 ?
unsigned long long 開方竟然會有精度損失 ?
迷也......
代碼如下:
@Frosero
#include <iostream>
#include <cstdio>
#include <cmath>
#define INF 0x3f3f3f3f
using namespace std;
int T;
unsigned long long p,a,b,x,y;
unsigned long long how(unsigned long long n){
unsigned long long ans,tmp;
if(n < 6) return 0;
ans = n / 2 - 2; tmp = sqrt((long double)n);
if(tmp & 1) ans++;
return ans;
}
int main(){
scanf("%d",&T);
while(T--){
cin>>a>>b;
y = how(b); x = how(a-1);
cout<<y - x<<endl;
}
return 0;
}