#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/problems/2963"
#include"optimization/canonical_coin_system.hpp"
#include<bits/stdc++.h>intmain(){std::cin.tie(0)->sync_with_stdio(0);longlongA,B;std::cin>>A>>B;auto[canonical,w,mw]=greedy_optimality(std::vector{1LL,A,B});std::cout<<w<<"\n";}
#line 1 "test/optimization/aizu2963.test.cpp"
#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/problems/2963"
#line 1 "optimization/canonical_coin_system.hpp"
#include<algorithm>
#include<numeric>
#include<tuple>
#include<vector>// O(n^3), requires distinct positive integers including 1// return (is canonical, smallest counterexample w, M(w))// David Pearson, "A Polynomial-time Algorithm for the Change-Making Problem"template<typenameT>std::tuple<bool,T,std::vector<T>>greedy_optimality(std::vector<T>coins){auton=int(coins.size());std::sort(coins.rbegin(),coins.rend());autogreedy=[&](Tx){std::vector<T>v(n);for(autoi=0;i<n;++i){v[i]=x/coins[i];x%=coins[i];}returnv;};autocount=[](conststd::vector<T>&v){returnstd::accumulate(v.begin(),v.end(),T(0));};autocomp=[&](constauto&a,constauto&b){constauto&[ca,wa,ma]=a;constauto&[cb,wb,mb]=b;if(ca!=cb)returnca<cb;if(wa!=wb)returnwa<wb;autosa=count(ma);autosb=count(mb);if(sa!=sb)returnsa<sb;returnma>mb;};std::tuple<bool,T,std::vector<T>>ans{true,-1,{}};for(autoi=1;i<n;++i){autov=greedy(coins[i-1]-1);for(autoj=i;j<n;++j){std::vector<T>mw(n);std::copy(v.begin(),v.begin()+j,mw.begin());mw[j]=v[j]+1;autow=std::inner_product(coins.begin(),coins.end(),mw.begin(),T(0));autogw=greedy(w);if(count(mw)<count(gw)){ans=std::ranges::min(ans,{false,w,mw},comp);}}}returnans;}#line 4 "test/optimization/aizu2963.test.cpp"
#include<bits/stdc++.h>intmain(){std::cin.tie(0)->sync_with_stdio(0);longlongA,B;std::cin>>A>>B;auto[canonical,w,mw]=greedy_optimality(std::vector{1LL,A,B});std::cout<<w<<"\n";}