bool next_combination(vector<ll>& v,ll max_num){
if(v.back()!=max_num){
v.back()=v.back()+1;
return true;
}
ll pre=max_num+1;
for(ll i=v.size()-1;i>=0;i--){
if(v[i]!=pre-1){
v[i]=v[i]+1;
for(ll j=i+1;j<v.size();j++){
v[j]=v[j-1]+1;
}
return true;
}
pre=v[i];
}
return false;
}
Atcoder ABC328E で出題されて解けなかったので,
標準であるnext_permutationみたいに使えるものを書いてみました.
ACコード https://atcoder.jp/contests/abc328/submissions/47591373
考え方
画像は5C3=10の場合
{1,2,3,4,5}から3つ選ぶ10通りを列挙する方針.
スタートは{1,2,3} max_num=5
・配列の末尾がmax_numより小さければ末尾+=1
・配列の末尾がmax_numであれば,配列を後ろから見ていき,
右に動かせる数字があれば,それを右に動かす.
動かした数より大きい数は左にしきつめる.
画像を上から見てもらうと,この考え方で列挙できています.
コードの実装もこのままです.
型などテンプレート化していないので,ライブラリとして使うなら,
ほかの人が作っているものを使うことをおすすめします.