結果

問題 No.2776 Bigger image
ユーザー GOTKAKO
提出日時 2024-06-19 19:18:42
言語 C++17(gcc12)
(gcc 12.3.0 + boost 1.87.0)
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 3,383 bytes
コンパイル時間 6,919 ms
コンパイル使用メモリ 243,852 KB
最終ジャッジ日時 2025-02-21 23:22:33
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
main.cpp: In member function '__int128 frac::gcd128(__int128, __int128)':
main.cpp:20:30: error: call of overloaded 'abs(__int128&)' is ambiguous
   20 |         if(b == 0) return abs(a);
      |                           ~~~^~~
In file included from /home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.4.0/include/c++/12/bits/std_abs.h:38,
                 from /home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.4.0/include/c++/12/cmath:47,
                 from /home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.4.0/include/c++/12/x86_64-pc-linux-gnu/bits/stdc++.h:41,
                 from main.cpp:1:
/usr/include/stdlib.h:980:12: note: candidate: 'int abs(int)'
  980 | extern int abs (int __x) __THROW __attribute__ ((__const__)) __wur;
      |            ^~~
/home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.4.0/include/c++/12/bits/std_abs.h:79:3: note: candidate: 'constexpr long double std::abs(long double)'
   79 |   abs(long double __x)
      |   ^~~
/home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.4.0/include/c++/12/bits/std_abs.h:75:3: note: candidate: 'constexpr float std::abs(float)'
   75 |   abs(float __x)
      |   ^~~
/home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.4.0/include/c++/12/bits/std_abs.h:71:3: note: candidate: 'constexpr double std::abs(double)'
   71 |   abs(double __x)
      |   ^~~
/home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.4.0/include/c++/12/bits/std_abs.h:61:3: note: candidate: 'long long int std::abs(long long int)'
   61 |   abs(long long __x) { return __builtin_llabs (__x); }
      |   ^~~
/home/linuxbrew/.linuxbrew/Cellar/gcc@12/12.4.0/include/c++/12/bits/std_abs.h:56:3: note: candidate: 'long int std::abs(long int)'
   56 |   abs(long __i) { return __builtin_labs(__i); }
      |   ^~~
main.cpp:21:23: error: call of overloaded 'abs(__int128&)' is ambiguous
   21 |         return gcd(abs(a),abs(b));
      |                    ~~~^~~
/usr/include/stdlib.h:980:12: note: candidate: 'int abs(int)'
  980 | extern int abs (int __x) __THROW __attribute__ ((__const__)) __wur;
     

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;

struct frac{ //最終的に分子分母64bitに収まる計算のみ.
    public:
    long long n,d;
    frac() : n(0),d(1){}
    frac(long long v) : n(v),d(1) {}
    frac(__int128_t a,__int128_t b,bool redu = true){
        assert(b != 0);
        if(redu) reduce(a,b);
        n = a,d = b; 
    }
    private:
    __int128_t gcd(__int128_t a,__int128_t b){
        if(a%b == 0) return b;
        return gcd(b,a%b);
    } 
    __int128_t gcd128(__int128_t a,__int128_t b){ //絶対値gcd128.
        if(b == 0) return abs(a);
        return gcd(abs(a),abs(b));
    }
    void reduce(__int128_t &a,__int128_t &b){ //約分.
        if(b < 0) a = -a,b = -b;
        __int128_t div = gcd128(a,b);
        a /= div; b /= div;
    }
    public:
    //計算量 O(logmax(d,b.d)).
    friend frac operator+(const frac &b){return b;}
    friend frac operator-(const frac &b){return frac(-b.n,b.d,false);}
    friend frac operator+(const frac &a,const frac &b){
        return frac((__int128_t)a.n*b.d+(__int128_t)b.n*a.d,(__int128_t)a.d*b.d);
    } 
    friend frac operator-(const frac &a,const frac &b){
        return frac((__int128_t)a.n*b.d-(__int128_t)b.n*a.d,(__int128_t)a.d*b.d);
    }
    friend frac operator*(const frac &a,const frac &b){
        long long g1 = std::gcd(a.n,b.d),g2 = std::gcd(a.d,b.n);
        return frac((a.n/g1)*(b.n/g2),(a.d/g2)*(b.d/g1),false);
    }
    friend frac operator/(const frac &a,const frac &b){
        assert(b.n != 0);
        long long g1 = std::gcd(a.n,b.n),g2 = std::gcd(a.d,b.d);
        if(b.n < 0) return frac((-a.n/g1)*(b.d/g2),(a.d/g2)*(-b.n/g1));
        else return frac((a.n/g1)*(b.d/g2),(a.d/g2)*(b.n/g1));
    }
    friend bool operator==(const frac &a,const frac &b){return a.n==b.n && a.d==b.d;}
    friend bool operator!=(const frac &a,const frac &b){return a.n!=b.n || a.d!=b.d;}
    friend bool operator>(const frac &a,const frac &b){return (__int128_t)a.n*b.d > (__int128_t)b.n*a.d;}
    friend bool operator>=(const frac &a,const frac &b){return (__int128_t)a.n*b.d >= (__int128_t)b.n*a.d;}
    friend bool operator<(const frac &a,const frac &b){return (__int128_t)a.n*b.d < (__int128_t)b.n*a.d;}
    friend bool operator<=(const frac &a,const frac &b){return (__int128_t)a.n*b.d <= (__int128_t)b.n*a.d;}

    frac &operator=(const frac &b) = default;
    frac operator+=(const frac &b){return *this=*this+b;}
    frac operator-=(const frac &b){return *this=*this-b;}
    frac operator*=(const frac &b){return *this=*this*b;}
    frac operator/=(const frac &b){return *this=*this/b;}
    frac operator++(int){*this += frac(1); return *this;}
    frac operator--(int){*this -= frac(1); return *this;}

    double decimal(){return (n+0.0)/d;}
    long double decimall(){return ((long double)n)/d;}
    long long num(){return n;} long long den(){return d;}
    long long floor(){return n<0?(n+1)/d-1:n/d;}
    long long ceil(){return n>0?(n-1)/d+1:n/d;}
    frac inv(){return frac(n>=0?d:-d,n>=0?n:-n,false);}
};

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int A,B,H,W; cin >> A >> B >> H >> W;
    frac one = min(H*frac(H,A)*B,frac(W,B)*A*W);
    swap(A,B);
    frac two = min(H*frac(H,A)*B,frac(W,B)*A*W);
    if(one > two) cout << "Non-rotating" << endl;
    else if(one == two) cout << "Same" << endl;
    else cout << "Rotating" << endl;
}
0