#ifndef LOCAL
#pragma GCC optimize("O3")
#endif
//#include <bits/stdc++.h>
#include <bit>
#include <print>
#include <iostream>
#include <bitset>
#include <cassert>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <algorithm>
#include <functional>
#include <ranges>
#include <numeric>
#define FOR(i,p,k) for(int i=(p); i<=(k); ++i)
#define REP(i,k) FOR(i,0,(k)-1)
#define RFOR(i,p,n) for(int i=(p); i>=(n); --i)
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define ssize(x) int((x).size())
#define fi first
#define se second
#define V vector
#define pb push_back
#define eb emplace_back
#define C const
#define pn printf("\n")
using namespace std;
typedef long long ll;
typedef V <int> vi;
typedef V <ll> vll;
typedef C int ci;
typedef C ll cll;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
void chmin(auto &a, auto b){a=min(a,b);}
void chmax(auto &a, auto b){a=max(a,b);}
ci inf=2.1e9;
cll infll=4.5e18;
int I(){
int z;
while ((z=getchar_unlocked())<'-'||z>'9');
C bool czymin=z=='-';
int r=czymin ? 0 : z-'0';
while ((z=getchar_unlocked())>='0'&&z<='9')
r=r*10+z-'0';
return czymin ? -r : r;
}
int makspal(C auto &in) {
int n = ssize(in);
array<vi, 2> radius = {{vi(n - 1), vi(n)}};
REP(parity, 2) {
int z = parity ^ 1, L = 0, R = 0;
REP(i, n - z) {
int &rad = radius[parity][i];
if(i <= R - z)
rad = min(R - i, radius[parity][L + (R - i - z)]);
int l = i - rad + z, r = i + rad;
while(0 <= l - 1 && r + 1 < n && in[l - 1] == in[r + 1])
++rad, ++r, --l;
if(r > R)
L = l, R = r;
}
}
ci maks0=n>1 ? *max_element(all(radius[0])) : 0,maks1=*max_element(all(radius[1]));
ci maks=max(maks1*2+1, maks0*2);
return maks;
}
vi prp[9][9];
void mkprp(){
FOR(dl, 1, 8) {
ci fm=(1<<dl)-1;
REP(m, fm+1) {
vi v(dl);
REP(i, dl)
v[i]=(m>>i)&1;
ci pal=makspal(v);
if (!ssize(prp[dl][pal]))
prp[dl][pal]=v;
}
}
}
C vi pattern={1, 0, 1, 1, 0, 0};
void ans() {
ci n=I(),k=I();
auto wyp=[&](C auto &v) {
for (ci i : v)
print("{}", i ? 'A' : 'P');
println("");
};
if (n>=9) {
if (k<4) {
println("NIE");
return;
}
vi wyn(n);
FOR(i, k, n-1)
wyn[i]=pattern[(i-k)%ssize(pattern)];
assert(makspal(wyn)==k);
wyp(wyn);
return;
}
if (ssize(prp[n][k])) {
assert(makspal(prp[n][k])==k);
wyp(prp[n][k]);
}
else
println("NIE");
}
int main(){
ios_base::sync_with_stdio(0),cin.tie(0);
mkprp();
int tt=1;
tt=I();
while (tt--)ans();
}
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 | #ifndef LOCAL #pragma GCC optimize("O3") #endif //#include <bits/stdc++.h> #include <bit> #include <print> #include <iostream> #include <bitset> #include <cassert> #include <vector> #include <map> #include <unordered_map> #include <set> #include <algorithm> #include <functional> #include <ranges> #include <numeric> #define FOR(i,p,k) for(int i=(p); i<=(k); ++i) #define REP(i,k) FOR(i,0,(k)-1) #define RFOR(i,p,n) for(int i=(p); i>=(n); --i) #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() #define ssize(x) int((x).size()) #define fi first #define se second #define V vector #define pb push_back #define eb emplace_back #define C const #define pn printf("\n") using namespace std; typedef long long ll; typedef V <int> vi; typedef V <ll> vll; typedef C int ci; typedef C ll cll; typedef pair <int, int> pii; typedef pair <ll, ll> pll; void chmin(auto &a, auto b){a=min(a,b);} void chmax(auto &a, auto b){a=max(a,b);} ci inf=2.1e9; cll infll=4.5e18; int I(){ int z; while ((z=getchar_unlocked())<'-'||z>'9'); C bool czymin=z=='-'; int r=czymin ? 0 : z-'0'; while ((z=getchar_unlocked())>='0'&&z<='9') r=r*10+z-'0'; return czymin ? -r : r; } int makspal(C auto &in) { int n = ssize(in); array<vi, 2> radius = {{vi(n - 1), vi(n)}}; REP(parity, 2) { int z = parity ^ 1, L = 0, R = 0; REP(i, n - z) { int &rad = radius[parity][i]; if(i <= R - z) rad = min(R - i, radius[parity][L + (R - i - z)]); int l = i - rad + z, r = i + rad; while(0 <= l - 1 && r + 1 < n && in[l - 1] == in[r + 1]) ++rad, ++r, --l; if(r > R) L = l, R = r; } } ci maks0=n>1 ? *max_element(all(radius[0])) : 0,maks1=*max_element(all(radius[1])); ci maks=max(maks1*2+1, maks0*2); return maks; } vi prp[9][9]; void mkprp(){ FOR(dl, 1, 8) { ci fm=(1<<dl)-1; REP(m, fm+1) { vi v(dl); REP(i, dl) v[i]=(m>>i)&1; ci pal=makspal(v); if (!ssize(prp[dl][pal])) prp[dl][pal]=v; } } } C vi pattern={1, 0, 1, 1, 0, 0}; void ans() { ci n=I(),k=I(); auto wyp=[&](C auto &v) { for (ci i : v) print("{}", i ? 'A' : 'P'); println(""); }; if (n>=9) { if (k<4) { println("NIE"); return; } vi wyn(n); FOR(i, k, n-1) wyn[i]=pattern[(i-k)%ssize(pattern)]; assert(makspal(wyn)==k); wyp(wyn); return; } if (ssize(prp[n][k])) { assert(makspal(prp[n][k])==k); wyp(prp[n][k]); } else println("NIE"); } int main(){ ios_base::sync_with_stdio(0),cin.tie(0); mkprp(); int tt=1; tt=I(); while (tt--)ans(); } |
English