#ifdef NACHIA #define _GLIBCXX_DEBUG #else // disable assert #define NDEBUG #endif #include #include #include #include using namespace std; using ll = long long; const ll INF = 1ll << 60; #define REP(i,n) for(ll i=0; i using V = vector; template void chmax(A& l, const B& r){ if(l < r) l = r; } template void chmin(A& l, const B& r){ if(r < l) l = r; } void testcase(){ ll N, D; cin >> N >> D; V> BA(N); for(auto& [b,a] : BA) cin >> a >> b; sort(BA.rbegin(), BA.rend()); ll cnt = 0; ll offset_1 = 0; for(auto [b,a] : BA) cnt += a; while(cnt >= D){ auto [b,a] = BA.back(); cnt -= a; offset_1 = b; BA.pop_back(); } ll offset_2 = 0; for(auto& [b,a] : BA){ b -= offset_1; offset_2 += b / D * a; b %= D; } sort(BA.begin(), BA.end()); // cout << "offset_1 = " << offset_1 << " , offset_2 = " << offset_2 << endl; // for(auto [b,a] : BA) REP(t,a) cout << b << " "; cout << endl; ll ans = cnt; ll pt = cnt; for(auto [b,a] : BA){ pt -= a; chmin(ans, pt + b); } ans += offset_1 + offset_2; cout << ans << "\n"; } int main(){ cin.tie(0)->sync_with_stdio(0); testcase(); return 0; }