#include<bits/stdc++.h> using namespace std; # ifdef DEB # define debug(...) fprintf(stderr, __VA_ARGS__) # else # define debug(...) #endif #define F first #define S second #define MP make_pair #define PB push_back #define LL long long #define LD long double #define PII pair<int, int> #define PLL pair<LL, LL> #define pb pop_back #define VI vector<int> #define VPI vector<PII> #define FOR(i,a,b) for(int i = (a); i <= (b); i++) #define FORD(i,a,b) for(int i = (a); i >= (b); i--) #define RE(i,n) FOR(i,1,n) #define REP(i,n) FOR(i,0,(int)(n)-1) #define ALL(x) (x).begin(), (x).end() #define siz(V) ((int)V.size()) int P[32], n, t; vector<bool> B[15][33000]; vector<int> Q; int X[]={1, -1, -1, 1}, Y[]={1, 1, -1, -1}; int NewD[][4][2]={{{0, 1}, {1, 0}, {2, 3}, {3, 2}}, {{0, 3}, {1, 2}, {2, 1}, {3, 0}}}; //0-vertical, 1-horizontal //0-notwall, 1-wall void build(int ind) { FOR(i, P[ind]+1, P[ind+1]-1) { RE(j, P[ind-1]) { B[ind][i][j]=B[ind-1][i-P[ind]][min(j, P[ind-1]-j+((i%2)^1))]; } } FOR(i, 1, P[ind]-1) { RE(j, P[ind-1]) { int h=j*2-((i%2)^1), d=(P[ind]-i+1)/2; B[ind][i][j]=B[ind][h+P[ind]][d]; } } B[ind][P[ind]][1]=true; B[ind][P[ind]+1][P[ind-1]]=true; /*FORD(i, P[ind+1]-1, 1) { FOR(j, 1, P[ind-1]) { //debug("%d ", B[ind][i][j]); cout<< B[ind][i][j] << ' '; } cout<< "\n"; } cout<< "\n\n";*/ } void solve() { REP(i, t) { int a; scanf("%d", &a); Q.PB(a); } int dir=3, posx=1, posy=0, time=0; REP(i, t) { while(time<Q[i]) { time++; bool iswall=B[n][posy][(min(posx, P[n+1]-posx)+1)/2]; if((posy%2==0 && posy>0 && posy<P[n+1]) || posx==0 || posx==P[n+1]) dir=NewD[0][dir][iswall]; else dir=NewD[1][dir][iswall]; //debug("time=%d dir=%d iswall=%d\n", time, dir, iswall); posx+=X[dir]; posy+=Y[dir]; } printf("%d %d\n", posx, posy); } } int main() { //ios_base::sync_with_stdio(0); P[0]=1; RE(i, 31) P[i]=P[i-1]*2; scanf("%d%d", &n, &t); if(n>=15) return 0; FOR(i, 1, n) { FOR(j, 0, P[i+1]) { //debug("%d %d %d\n", i, j, P[i-1]); B[i][j].resize(P[i-1]+1, false); B[i][j].shrink_to_fit(); } } B[1][2][1]=true; B[1][3][1]=true; FOR(i, 2, n) build(i); FOR(i, 1, n) { FOR(j, 0, P[i-1]) { B[i][0][j]=true; B[i][P[i+1]][j]=true; } FOR(j, 0, P[i+1]) B[i][j][0]=true; } solve(); return 0; }
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 | #include<bits/stdc++.h> using namespace std; # ifdef DEB # define debug(...) fprintf(stderr, __VA_ARGS__) # else # define debug(...) #endif #define F first #define S second #define MP make_pair #define PB push_back #define LL long long #define LD long double #define PII pair<int, int> #define PLL pair<LL, LL> #define pb pop_back #define VI vector<int> #define VPI vector<PII> #define FOR(i,a,b) for(int i = (a); i <= (b); i++) #define FORD(i,a,b) for(int i = (a); i >= (b); i--) #define RE(i,n) FOR(i,1,n) #define REP(i,n) FOR(i,0,(int)(n)-1) #define ALL(x) (x).begin(), (x).end() #define siz(V) ((int)V.size()) int P[32], n, t; vector<bool> B[15][33000]; vector<int> Q; int X[]={1, -1, -1, 1}, Y[]={1, 1, -1, -1}; int NewD[][4][2]={{{0, 1}, {1, 0}, {2, 3}, {3, 2}}, {{0, 3}, {1, 2}, {2, 1}, {3, 0}}}; //0-vertical, 1-horizontal //0-notwall, 1-wall void build(int ind) { FOR(i, P[ind]+1, P[ind+1]-1) { RE(j, P[ind-1]) { B[ind][i][j]=B[ind-1][i-P[ind]][min(j, P[ind-1]-j+((i%2)^1))]; } } FOR(i, 1, P[ind]-1) { RE(j, P[ind-1]) { int h=j*2-((i%2)^1), d=(P[ind]-i+1)/2; B[ind][i][j]=B[ind][h+P[ind]][d]; } } B[ind][P[ind]][1]=true; B[ind][P[ind]+1][P[ind-1]]=true; /*FORD(i, P[ind+1]-1, 1) { FOR(j, 1, P[ind-1]) { //debug("%d ", B[ind][i][j]); cout<< B[ind][i][j] << ' '; } cout<< "\n"; } cout<< "\n\n";*/ } void solve() { REP(i, t) { int a; scanf("%d", &a); Q.PB(a); } int dir=3, posx=1, posy=0, time=0; REP(i, t) { while(time<Q[i]) { time++; bool iswall=B[n][posy][(min(posx, P[n+1]-posx)+1)/2]; if((posy%2==0 && posy>0 && posy<P[n+1]) || posx==0 || posx==P[n+1]) dir=NewD[0][dir][iswall]; else dir=NewD[1][dir][iswall]; //debug("time=%d dir=%d iswall=%d\n", time, dir, iswall); posx+=X[dir]; posy+=Y[dir]; } printf("%d %d\n", posx, posy); } } int main() { //ios_base::sync_with_stdio(0); P[0]=1; RE(i, 31) P[i]=P[i-1]*2; scanf("%d%d", &n, &t); if(n>=15) return 0; FOR(i, 1, n) { FOR(j, 0, P[i+1]) { //debug("%d %d %d\n", i, j, P[i-1]); B[i][j].resize(P[i-1]+1, false); B[i][j].shrink_to_fit(); } } B[1][2][1]=true; B[1][3][1]=true; FOR(i, 2, n) build(i); FOR(i, 1, n) { FOR(j, 0, P[i-1]) { B[i][0][j]=true; B[i][P[i+1]][j]=true; } FOR(j, 0, P[i+1]) B[i][j][0]=true; } solve(); return 0; } |