結果
| 問題 | 
                            No.281 門松と魔法(1)
                             | 
                    
| コンテスト | |
| ユーザー | 
                             commy
                         | 
                    
| 提出日時 | 2019-03-31 22:51:37 | 
| 言語 | C++14  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 2 ms / 1,000 ms | 
| コード長 | 1,715 bytes | 
| コンパイル時間 | 554 ms | 
| コンパイル使用メモリ | 69,204 KB | 
| 実行使用メモリ | 5,248 KB | 
| 最終ジャッジ日時 | 2024-11-22 14:31:23 | 
| 合計ジャッジ時間 | 2,400 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge5 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 57 | 
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#define REP(i, a, b) for (int i = int(a); i < int(b); i++)
#ifdef _DEBUG_
#define dump(val) cerr << __LINE__ << ":\t" << #val << " = " << (val) << endl
#else
#define dump(val)
#endif
using namespace std;
typedef long long int ll;
template<typename T>
vector<T> make_v(size_t a, T b) {
    return vector<T>(a, b);
}
template<typename... Ts>
auto make_v(size_t a, Ts... ts) {
    return vector<decltype(make_v(ts...))>(a, make_v(ts...));
}
// <>
ll f1(ll d, ll a, ll b, ll c) {
    if (b == 0) return -1;
    int res = 0;
    if (a >= b) {
        if (d == 0) return -1;
        res += (a - b) / d + 1;
        a = max(0LL, a - d * ((a - b) / d + 1));
    }
    if (c >= b) {
        if (d == 0) return -1;
        res += (c - b) / d + 1;
        c = max(0LL, c - d * ((c - b) / d + 1));
    }
    if (a == c) {
        a = max(0LL, a - d);
        res++;
        if (a == c) {
            return -1;
        }
    }
    return res;
}
// ><
ll f2(ll d, ll a, ll b, ll c) {
    int res = 0;
    if (a == c) {
        a = max(0LL, a - d);
        res = 1;
    }
    if (a == 0 || c == 0) return -1;
    ll m = b - min(a, c);
    if (m < 0) {
        return 0;
    }
    if (d == 0) {
        return -1;
    }
    return m / d + 1 + res; 
}
int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    ll d, a, b, c;
    cin >> d >> a >> b >> c;
    ll res1 = f1(d, a, b, c), res2 = f2(d, a, b, c);
    if (res1 == -1 && res2 == -1) {
        cout << -1 << endl;
    } else if (res1 == -1 || res2 == -1) {
        cout << max(res1, res2) << endl;
    } else {
        cout << min(res1, res2) << endl;
    }
    return 0;
}
            
            
            
        
            
commy