#include using namespace std; bool check(string s){ sort(s.begin(),s.end()); for(int i=1;i; vector val; vector> groups; vector sums; vector> ginv; vector uncall; void work(){ while(true){ // check vector know; for(int i=0;i s; for(int i=0;i<=99999;i++){ int v=i; string cur; for(int j=0;j<5;j++){ cur.push_back('0'+v%10); v/=10; } reverse(cur.begin(),cur.end()); if(check(cur)){s.push_back(cur);} } val.resize(s.size()); for(auto &nx : val){nx=-1;} ginv.resize(s.size()); for(auto &nx : ginv){nx.clear();} int done=0; vector known; while(true){ int qid; if(!uncall.empty()){ qid=uncall.back(); uncall.pop_back(); } else{ double best=-1.0; for(int i=0;i bk(32,0); vector> hb(30); for(auto &nx : hb){ cin >> nx.first >> nx.second; if(nx.first==5){cur++;} else{bk[nx.first*6+nx.second]++;} } if(hb[0].first==5){return 0;} if(val[qid]==-1){ val[qid]=cur-done; for(auto &nx : ginv[qid]){ groups[nx].erase(qid); sums[nx]-=val[qid]; } } if(cur!=done){ known.push_back(qid); } done=cur; for(auto &nx : known){ bk[hbc(s[qid],s[nx])]++; } work(); // generate vector> cgrp(32); for(int i=0;i app; for(auto &nx : cgrp[i]){ ginv[nx].push_back(groups.size()); app.insert(nx); } groups.push_back(app); sums.push_back(bk[i]); } } work(); } }