#include <bits/stdc++.h>
using namespace std;
char f1(long long d, long long radix)
{
if (d==0) return 'P';
if (d==1) return 'K';
return 'N';
}
long long f1f(char c, long long radix)
{
if (c=='P') return 0;
if (c=='K') return 1;
return 2;
}
long long f2(vector<unsigned int>& m, long long dziel)
{
if (dziel<=1) return 0;
unsigned long long r=0;
for (int i=(int)m.size()-1; i>=0; i--)
{
unsigned long long cur=(r<<32)+m[i];
m[i]=(unsigned int)(cur/dziel);
r=cur%dziel;
}
while (m.size()>1&&m.back()==0) m.pop_back();
return (unsigned int)r;
}
void f2f(vector<unsigned int>& m, long long dziel, long long di)
{
if (dziel<=1) return;
unsigned long long r=di;
for (int i=0; i<(int)m.size(); i++)
{
unsigned long long cur=(unsigned long long)m[i]*dziel+r;
m[i]=(unsigned int)(cur & 0xFFFFFFFFu);
r=cur>>32;
}
while (r>0)
{
m.push_back((unsigned int)(r & 0xFFFFFFFFu));
r>>=32;
}
}
bool czy(const vector<unsigned int>& C, int n) {
int words=n/32, bits=n%32;
if ((int)C.size()>words+1) return true;
if ((int)C.size()==words+1&&C.back()>=(1u<<bits)) return true;
return false;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string algo;
cin>>algo;
int n,t;
cin>>n>>t;
while (t--) {
mt19937 rng(1337);
string s;
cin >> s;
vector<unsigned int> freon((n+31)/32,0);
for (int i=0; i<n; i++)
{
if (s[i]=='1')
{
freon[i/32]|=(1u<<(i%32));
}
}
vector<unsigned int> s1={1},s2={1};
vector<pair<unsigned int,unsigned int>> ball;
int zamarza=0;
bool is_algosia=(algo=="Algosia");
while (!czy(s1,n)||!czy(s2, n))
{
long long p1=3,p2=3;
if (zamarza>1)
{
p1=2;
} else if (zamarza<-1)
{
p2=2;
}
long long son, synu;
if (is_algosia)
{
son=p1;
synu=p2;
} else
{
son=p2;
synu=p1;
}
int son1=rng() % 3;
int synu1=rng() % 3;
int son2=0;
if (son>1)
{
son2 = (int)f2(freon,son);
}
int sv=(son2+son1)%(int)son;
cout<<f1(sv,son)<<endl;
char c1;
cin>>c1;
int fralue=(int)f1f(c1,synu);
int synu2=(fralue-synu1+(int)synu)%(int)synu;
ball.push_back({(unsigned int)synu2,(unsigned int)synu});
f2f(s1,p1,0);
f2f(s2,p2,0);
int m1,m2;
if (is_algosia)
{
m1=sv;
m2=fralue;
}
else
{
m1=fralue;
m2=sv;
}
if (m1!=m2)
{
bool styrtapali=false;
if (m1==0&&m2==1) styrtapali=true;
if (m1==1&&m2==2) styrtapali=true;
if (m1==2&&m2==0) styrtapali=true;
if (styrtapali)
{
zamarza++;
}
else
{
zamarza--;
}
}
}
vector<unsigned int> d2={0};
for (int i=(int)ball.size()-1; i>=0; i--)
{
f2f(d2,ball[i].second,ball[i].first);
}
string res="";
for (int i=0; i<n; i++)
{
int b=0;
if (i/32<(int)d2.size())
{
b=(d2[i/32]>>(i%32))&1;
}
res+=(char)(b+'0');
}
cout<<"!"<<res<<endl;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | #include <bits/stdc++.h> using namespace std; char f1(long long d, long long radix) { if (d==0) return 'P'; if (d==1) return 'K'; return 'N'; } long long f1f(char c, long long radix) { if (c=='P') return 0; if (c=='K') return 1; return 2; } long long f2(vector<unsigned int>& m, long long dziel) { if (dziel<=1) return 0; unsigned long long r=0; for (int i=(int)m.size()-1; i>=0; i--) { unsigned long long cur=(r<<32)+m[i]; m[i]=(unsigned int)(cur/dziel); r=cur%dziel; } while (m.size()>1&&m.back()==0) m.pop_back(); return (unsigned int)r; } void f2f(vector<unsigned int>& m, long long dziel, long long di) { if (dziel<=1) return; unsigned long long r=di; for (int i=0; i<(int)m.size(); i++) { unsigned long long cur=(unsigned long long)m[i]*dziel+r; m[i]=(unsigned int)(cur & 0xFFFFFFFFu); r=cur>>32; } while (r>0) { m.push_back((unsigned int)(r & 0xFFFFFFFFu)); r>>=32; } } bool czy(const vector<unsigned int>& C, int n) { int words=n/32, bits=n%32; if ((int)C.size()>words+1) return true; if ((int)C.size()==words+1&&C.back()>=(1u<<bits)) return true; return false; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); string algo; cin>>algo; int n,t; cin>>n>>t; while (t--) { mt19937 rng(1337); string s; cin >> s; vector<unsigned int> freon((n+31)/32,0); for (int i=0; i<n; i++) { if (s[i]=='1') { freon[i/32]|=(1u<<(i%32)); } } vector<unsigned int> s1={1},s2={1}; vector<pair<unsigned int,unsigned int>> ball; int zamarza=0; bool is_algosia=(algo=="Algosia"); while (!czy(s1,n)||!czy(s2, n)) { long long p1=3,p2=3; if (zamarza>1) { p1=2; } else if (zamarza<-1) { p2=2; } long long son, synu; if (is_algosia) { son=p1; synu=p2; } else { son=p2; synu=p1; } int son1=rng() % 3; int synu1=rng() % 3; int son2=0; if (son>1) { son2 = (int)f2(freon,son); } int sv=(son2+son1)%(int)son; cout<<f1(sv,son)<<endl; char c1; cin>>c1; int fralue=(int)f1f(c1,synu); int synu2=(fralue-synu1+(int)synu)%(int)synu; ball.push_back({(unsigned int)synu2,(unsigned int)synu}); f2f(s1,p1,0); f2f(s2,p2,0); int m1,m2; if (is_algosia) { m1=sv; m2=fralue; } else { m1=fralue; m2=sv; } if (m1!=m2) { bool styrtapali=false; if (m1==0&&m2==1) styrtapali=true; if (m1==1&&m2==2) styrtapali=true; if (m1==2&&m2==0) styrtapali=true; if (styrtapali) { zamarza++; } else { zamarza--; } } } vector<unsigned int> d2={0}; for (int i=(int)ball.size()-1; i>=0; i--) { f2f(d2,ball[i].second,ball[i].first); } string res=""; for (int i=0; i<n; i++) { int b=0; if (i/32<(int)d2.size()) { b=(d2[i/32]>>(i%32))&1; } res+=(char)(b+'0'); } cout<<"!"<<res<<endl; } } |
English