Isa@Diary

ソフトウェア開発やってます。プログラミングとか、US生活とかについて書きます。

AOJ1109:Fermat's Last Theorem

問題

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1109
問題文通り。与えられたzについて
z^3-max{x^3 + y^3| x>0, y>0, x^3 + y^3 <= z^3}(x,y,zは整数)
を計算する。

方針

xを決めて条件を満たす最大のyを二分探索で求めて計算する。
二分探索は割とすぐ思いつけたのでよい。

以下ソースコード

#include <iostream>

using namespace std;

int main(){
    int n;
    while(cin >> n && n){
        int cubic = n*n*n;
        int ret= 1 << 29;
        int ub = 1111,lb=1;
        int maxi = 1111;

        for(int i=1;i<=maxi;i++){
            ub = 1111;
            lb = 1;
            while(ub - lb > 1){
                int mid = (ub + lb) / 2;
                if(i*i*i + mid*mid*mid <= cubic){
                    lb = mid;
                }else{
                    ub = mid;
                }
            }
            maxi = lb;
            ret = min(ret, cubic - i*i*i - lb*lb*lb);
        }
        cout << ret << endl;
    }
}