#include <bits/stdc++.h>
using namespace std;
int k,n,i,j,b,t,tt,ma;
long long z,a,nn;
vector<long long> h;
string g;
string s,s0,pkn;
bool cr;
uint64_t m,ka,kb,kn,km,cc,e,f,r,kr;
char c;
vector<uint64_t> u,v,u3,ua,ub,w,vt;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> g;
cin >> n >> t;
pkn="PKN";
m=1e9+7;
ma=3171;
ka=5738722646268;
//ka=0;
kb=ka;
ka*=ka;
f=1;
//for(i=0;i<18;i++) f*=3;
f=3;
e=1LL<<32LL;
kb=8283747373173;
kb*=kb;
if(g[0]=='A') {kn=ka; kr=kb;}
else {kn=kb; kr=ka;}
//kn=0;
for(tt=0;tt<t;tt++) {
cin >> s;
s0="";
nn=s.length();
km=kn;
k=0;
for(j=0;j<nn;j++) {
c=s[j]-'0';
c^=(km&1);
km>>=1;
s0+=(char)(c+'0');
k++;
if(k==64) { km=kn; k=0;}
}
s=s0;
//cout << s << '\n';
//for(i=0;i<5000; i++) s+="1";
s0="";
for(i=0;i<(32-n%32);i++) s0+='0';
s=s0+s;
nn=s.length();
u={};
//cout << s << '\n';
cc=0;
for(j=0;j<nn;j++) {
c=s[j]-'0';
cc<<=1;
cc+=c;
//u.push_back(c);
if((j+1)%32==0) {u.push_back(cc);
//cout << cc << '\n';
cc=0;}
}
j=0;
//u.push_back(0);
nn=u.size();
ua=u;
ub={};
r=0;
cr=1;
v={};
while(cr) {
cr=0;
r=0;
for(j=nn-1;j>=0;j--) {
r<<=32;
r+=ua[j];
if(r>=f) {ub.push_back(r/f); r%=f; cr=1;}
else ub.push_back(0);
}
v.push_back(r);
reverse(ub.begin(),ub.end());
ua=ub;
ub={};
nn=ua.size();
}
while(v.size()<ma) v.push_back(0);
j=0;
vt={};
while(j<ma) {
cout << pkn[v[j]] << flush;
cin >> c;
//c=pkn[v[j]];
if(c==pkn[v[j]]) {vt.push_back(v[j]);}
else {
if(c==pkn[(v[j]+1)%3]) vt.push_back((v[j]+1)%3);
else if (c==pkn[(v[j]+2)%3]) vt.push_back((v[j]+2)%3);
cout << c << flush;
cin >> c;
}
j++;
}
//cout << v.size()<< '\n';
//for(auto aa:vt) cout << aa << ' ';
cout << '\n';
cr=1;
ua=vt;
ub={};
w={};
nn=ua.size();
while(cr) {
cr=0;
r=0;
for(j=nn-1;j>=0;j--) {
r*=f;
r+=ua[j];
if(r>=e) {ub.push_back(r>>32LL); r%=e; cr=1;}
else ub.push_back(0);
}
w.push_back(r);
reverse(ub.begin(),ub.end());
ua=ub;
ub={};
nn=ua.size();
}
s="";
for(auto aa:w) {
//cout << aa << '\n';
s0="";
for(i=0;i<32;i++){
c=aa&1;
aa>>=1;
s0+=(char)(c+'0');
}
reverse(s0.begin(),s0.end());
s+=s0;
}
//cout << s << '\n';
s0="";
nn=s.length();
cout << "! ";
for(i=0;i<5000;i++)
s0+='0';
s=s0+s;
nn=s.length();
k=0;
km=kr;
//cout << kr << '\n';
for(i=nn-n;i<nn;i++) {
c=s[i]-'0';
c^=(km&1);
cout << (char)(c+'0');
km>>=1;
k++;
if(k==64) {km=kr; k=0;}
}
cout << '\n' << flush;
}
}
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 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | #include <bits/stdc++.h> using namespace std; int k,n,i,j,b,t,tt,ma; long long z,a,nn; vector<long long> h; string g; string s,s0,pkn; bool cr; uint64_t m,ka,kb,kn,km,cc,e,f,r,kr; char c; vector<uint64_t> u,v,u3,ua,ub,w,vt; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> g; cin >> n >> t; pkn="PKN"; m=1e9+7; ma=3171; ka=5738722646268; //ka=0; kb=ka; ka*=ka; f=1; //for(i=0;i<18;i++) f*=3; f=3; e=1LL<<32LL; kb=8283747373173; kb*=kb; if(g[0]=='A') {kn=ka; kr=kb;} else {kn=kb; kr=ka;} //kn=0; for(tt=0;tt<t;tt++) { cin >> s; s0=""; nn=s.length(); km=kn; k=0; for(j=0;j<nn;j++) { c=s[j]-'0'; c^=(km&1); km>>=1; s0+=(char)(c+'0'); k++; if(k==64) { km=kn; k=0;} } s=s0; //cout << s << '\n'; //for(i=0;i<5000; i++) s+="1"; s0=""; for(i=0;i<(32-n%32);i++) s0+='0'; s=s0+s; nn=s.length(); u={}; //cout << s << '\n'; cc=0; for(j=0;j<nn;j++) { c=s[j]-'0'; cc<<=1; cc+=c; //u.push_back(c); if((j+1)%32==0) {u.push_back(cc); //cout << cc << '\n'; cc=0;} } j=0; //u.push_back(0); nn=u.size(); ua=u; ub={}; r=0; cr=1; v={}; while(cr) { cr=0; r=0; for(j=nn-1;j>=0;j--) { r<<=32; r+=ua[j]; if(r>=f) {ub.push_back(r/f); r%=f; cr=1;} else ub.push_back(0); } v.push_back(r); reverse(ub.begin(),ub.end()); ua=ub; ub={}; nn=ua.size(); } while(v.size()<ma) v.push_back(0); j=0; vt={}; while(j<ma) { cout << pkn[v[j]] << flush; cin >> c; //c=pkn[v[j]]; if(c==pkn[v[j]]) {vt.push_back(v[j]);} else { if(c==pkn[(v[j]+1)%3]) vt.push_back((v[j]+1)%3); else if (c==pkn[(v[j]+2)%3]) vt.push_back((v[j]+2)%3); cout << c << flush; cin >> c; } j++; } //cout << v.size()<< '\n'; //for(auto aa:vt) cout << aa << ' '; cout << '\n'; cr=1; ua=vt; ub={}; w={}; nn=ua.size(); while(cr) { cr=0; r=0; for(j=nn-1;j>=0;j--) { r*=f; r+=ua[j]; if(r>=e) {ub.push_back(r>>32LL); r%=e; cr=1;} else ub.push_back(0); } w.push_back(r); reverse(ub.begin(),ub.end()); ua=ub; ub={}; nn=ua.size(); } s=""; for(auto aa:w) { //cout << aa << '\n'; s0=""; for(i=0;i<32;i++){ c=aa&1; aa>>=1; s0+=(char)(c+'0'); } reverse(s0.begin(),s0.end()); s+=s0; } //cout << s << '\n'; s0=""; nn=s.length(); cout << "! "; for(i=0;i<5000;i++) s0+='0'; s=s0+s; nn=s.length(); k=0; km=kr; //cout << kr << '\n'; for(i=nn-n;i<nn;i++) { c=s[i]-'0'; c^=(km&1); cout << (char)(c+'0'); km>>=1; k++; if(k==64) {km=kr; k=0;} } cout << '\n' << flush; } } |
English