HDU 4279 Number 坑爹的迷之精度

題目描述


首先定義"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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章