#include #if __has_include() #endif using namespace std; #define LL(...) ll __VA_ARGS__;lin(__VA_ARGS__) #define RDVL(T,n,...) vec__VA_ARGS__;fe(refs(__VA_ARGS__),e)e.get().resizes(n);lin(__VA_ARGS__) #define VL(n,...) RDVL(ll,n,__VA_ARGS__) #define fe(a,e,...) for(auto&&__VA_OPT__([)e __VA_OPT__(,__VA_ARGS__]):a) #define defpp templatevoid pp(const auto&...a){[[maybe_unused]]const char*c="";((o<(a...);} #define entry defpp void main();void main2();}int main(){my::io();my::main();}namespace my{ namespace my{ void io(){cin.tie(nullptr)->sync_with_stdio(0);cout<>...>>a);} constexpr auto abs(auto x){return x<0?-x:x;} templateT pow2(ll n){return T(1)<0)x>>=1,++r;return r;} auto min(auto...a){return min(initializer_list>{a...});} auto binary_search(ll o,ll x,const auto&f){while(abs(o-x)>1)(f((o+x)/2)?o:x)=(o+x)/2;return o;} template>auto&sort(auto&a,F f={}){ranges::sort(a,f);return a;} templateusing pack_back_t=tuple_element_t>; } namespace my{ templateistream&operator>>(istream&i,vector&v){fe(v,e)i>>e;return i;} templateconstexpr int depth=0; templatestruct core_t_helper{using type=T;}; templateusing core_t=core_t_helper::type; templatestruct vec; templatestruct hvec_helper{using type=vec::type>;}; templatestruct hvec_helper<0,T>{using type=T;}; templateusing hvec=hvec_helper::type; templatestruct vec:vector{ static constexpr int D=depth+1; using C=core_t; using vector::vector; void resizes(const auto&...a){if constexpr(sizeof...(a)==D)*this=make(a...,C{});else{ }} static auto make(ll n,const auto&...a){ if constexpr(sizeof...(a)==1)return vec(n,array{a...}[0]); else { } } }; templaterequires(sizeof...(A)>=2)vec(const A&...a)->vec>>; } namespace my{ templatestruct priority_queue:std::priority_queue,F>{ priority_queue(const vector&a){fe(a,e)this->emplace(e);} ll size()const{return std::priority_queue,F>::size();} T pop(){T r=this->top();std::priority_queue,F>::pop();return r;} }; templateusing max_heap=priority_queue>; } namespace my{entry void main(){ LL(N); VL(N,A); sort(A); ll L=size2(A.back()); pp(binary_search(N+L,0,[&](ll X){ // X回以下でできるか auto a=A; ll cnt=0; max_heapq(a); while(X&&q.size()){ ll H=q.pop(); ll t=pow2(min(L,X-1)); X--; if(H>t)q.emplace(H-t); } return q.empty(); })); }}