//#pragma GCC optimize("O3") #include using namespace std; #define ll long long #define rep(i,n) for (ll i=0;i<(ll)n;i++) #define rrep(i,n) for (ll i=(n)-1;i>=(ll)0;i--) #define loop(i,m,n) for(ll i=m;i<=(ll)n;i++) #define rloop(i,m,n) for(ll i=m;i>=(ll)n;i--) #define vl vector #define vvl vector #define vvvl vector #define vdbg(a) rep(ii,a.size()){cout< //#define bbi boost::multiprecision::cpp_int //#include //整数同士の累乗の計算をする。 ll power(ll A, ll B) { ll result = 1; for (ll i=0;i 0){ if ((k&1) ==1)ans=(ans*n)%mod; n=n*n%mod; k >>= 1; } return ans; } //受け取った2次元文字の外側に、文字pをコーティングする。 vector pad(vector &s,char p){ ll h=s.size(); ll w=s[0].size(); vector res(h+2,string(w+2,p)); rep(i,h)rep(j,w)res[i+1][j+1]=s[i][j]; return res; } // Union-Find struct UnionFind { vector par, siz; UnionFind(int n) : par(n, -1) , siz(n, 1) { } // 根を求める int root(int x) { if (par[x] == -1) return x; else return par[x] = root(par[x]); } // x と y が同じグループに属するかどうか (根が一致するかどうか) bool issame(int x, int y) { return root(x) == root(y); } // x を含むグループと y を含むグループとを併合する bool unite(int x, int y) { x = root(x), y = root(y); if (x == y) return false; if (siz[x] < siz[y]) swap(x, y); par[y] = x; siz[x] += siz[y]; return true; } // x を含むグループのサイズ int size(int x) { return siz[root(x)]; } }; //グリッド問題等用 vl dx={1,0,-1,0}; vl dy={0,1,0,-1}; bool judge(ll m,vector s){ return true; } void solve(){ ll m; cin>>m; ll rowm=m; if(m>1000000000000000){ assert(false); cout<<-1< ans(40,string(40,'#')); rep(i,12){ loop(x,i*3,i*3+3){ loop(y,i*3,i*3+3){ ans[x][y]='.'; } } loop(xy,i*3,39){ ans[xy][i*3]='.'; ans[xy][i*3+1]='.'; ans[i*3][xy]='.'; ans[i*3+1][xy]='.'; } } rep(i,40){ ans[i][39]='.'; ans[39][i]='.'; } vl keta; rep(i,12){ keta.push_back(m%20); m/=20; } vl bunkatu(20); bunkatu[0]=0; bunkatu[1]=1; bunkatu[2]=2; bunkatu[3]=2; bunkatu[4]=4; bunkatu[5]=5; bunkatu[6]=5; bunkatu[7]=5; bunkatu[8]=4; bunkatu[9]=5; bunkatu[10]=5; bunkatu[11]=6; bunkatu[12]=6; bunkatu[13]=9; bunkatu[14]=9; bunkatu[15]=9; bunkatu[16]=9; bunkatu[17]=9; bunkatu[18]=9; bunkatu[19]=9; rep(i,12){ ll down=bunkatu[keta[i]]; ll rights=keta[i]-bunkatu[keta[i]]; if(down==1){ ans[i*3+5][i*3+1]='P'; ans[i*3+4][i*3+1]='#'; } if(down==2){ ans[i*3+4][i*3]='P'; ans[i*3+4][i*3+1]='#'; if(i!=11){ ans[i*3+7][i*3]='#'; } } if(down==4){ ans[i*3+4][i*3]='#'; ans[i*3+4][i*3+1]='P'; } if(down>=5){ ans[i*3+down-1][i*3+1]='P'; } if(rights==1){ ans[i*3+1][i*3+5]='P'; ans[i*3+1][i*3+4]='#'; } if(rights==2){ ans[i*3][i*3+4]='P'; ans[i*3+1][i*3+4]='#'; if(i!=11){ ans[i*3][i*3+7]='#'; } } if(rights==4){ ans[i*3][i*3+4]='#'; ans[i*3+1][i*3+4]='P'; } if(rights>=5){ ans[i*3+1][i*3+rights-1]='P'; } if(rights==10&&i==10){ ans[i*3+1][i*3+rights-1]='.'; ans[i*3][i*3+rights-2]='P'; ans[i*3+1][i*3+rights-3]='P'; } } cout<<40<>t; rep(i,t)solve(); }