#include using namespace std; // Random number generator class xrand { uint64_t x; public: using result_type = uint32_t; static constexpr result_type min() { return std::numeric_limits::min(); } static constexpr result_type max() { return std::numeric_limits::max(); } xrand(uint64_t k) : x(k) {} xrand() : xrand(1) {} result_type operator()() { x ^= x << 9; return x ^= x >> 7; // return (x * 0x123456789abcdef) >> 32; } int64_t operator()(int m) { return int64_t((*this)()) * m >> 32; } double rand() { return double((*this)()) / (int64_t(1) << 32); } }; xrand rng; bool check(string s){ sort(s.begin(),s.end()); for(int i=1;i; using pdi=pair; vector ask(string s){ cout << s << "\n"; fflush(stdout); vector res(30); vector rv; for(int i=0;i<30;i++){ cin >> res[i].first >> res[i].second; rv.push_back(res[i].first*6+res[i].second); } // cerr << "done\n"; if(res[0].first==5 || res[0].first<0){exit(0);} // finish return rv; } int hbc(string s,string t){ int res=0; for(int k=0;k<5;k++){ if(s[k]==t[k]){res+=6;} } for(int k=0;k<5;k++){ for(int l=0;l<5;l++){ if(k==l){continue;} if(s[k]==t[l]){res++;} } } return res; } typedef struct{ string q; vector rem; vector> v; }his; vector alive; vector slis; map sinv; queue dead_q; vector> prbs; vector prb; vector hv; set ast; void incl(string s){ int sid=sinv[s]; for(int i=0;i remp(32,0); vector> vemp(32); 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)){ sinv[cur]=slis.size(); slis.push_back(cur); alive.push_back(1); } } prb.resize(slis.size()); vector prb_ini; for(int i=0;i vp; for(auto j : ast){ double f=0.0; for(int i=0;i1.99*vp.back().first){vp.pop_back();} else{break;} } q=slis[vp[rng(vp.size())].second]; } auto ar=ask(q); int ac=0; for(auto &nx : ar){ if(nx==30){ac++;} } if(pac!=ac){ if(alive[sinv[q]]){ ast.erase(sinv[q]); alive[sinv[q]]=0; incl(q); } } else{ if(alive[sinv[q]]){ ast.erase(sinv[q]); alive[sinv[q]]=0; excl(q); } } pac=ac; his cur; cur.q=q; cur.rem=remp; cur.v=vemp; for(auto &nx : ar){ if(nx<30){cur.rem[nx]++;} } for(auto i : ast){ int tg=hbc(q,slis[i]); cur.v[tg].push_back(i); } prbs.push_back(prb_ini); for(int i=0;i<30;i++){ if(cur.v[i].size()==0){continue;} if(cur.rem[i]==0){ for(auto &nx : cur.v[i]){ if(alive[nx]){ ast.erase(nx); alive[nx]=0; dead_q.push(nx); } } } else{ double app=cur.rem[i]; app/=cur.v[i].size(); for(auto &nx : cur.v[i]){ prbs[cq][nx]=app; } } } hv.push_back(cur); while(!dead_q.empty()){ auto od=dead_q.front(); dead_q.pop(); excl(slis[od]); } cerr << (cq+1) << " : " << (30-pac) << " " << ast.size() << "\n"; } }