#include #include using mint = atcoder::static_modint<998244353>; //using mint = atcoder::static_modint<1000000007>; using namespace std; using namespace atcoder; using ld = long double; using ll = long long; #define mp(a,b) make_pair(a,b) #define rep(i,s,n) for(int i=s; i> a >> b; if(a>b)swap(a,b); if(a==b){ set> S; int k=a*a+b*b; rep(i,0,2*a)rep(j,0,2*a)S.insert(mp(i*a,j*a)); for(auto p:S)cout << p.first << " " << p.second << "\n"; } else{ ll k=a*a+b*b; set> A,B; queue> Q; Q.push(mp(0,0)); A.insert(mp(0,0)); while(Q.size()>0){ auto p=Q.front(); Q.pop(); int x=p.first,y=p.second; x+=a,y+=b; x+=k,y+=k; x%=k,y%=k; if(A.find(mp(x,y))==A.end()){ Q.push(mp(x,y)); A.insert(mp(x,y)); } x-=a,y-=b; x+=b,y-=a; x+=k,y+=k; x%=k,y%=k; if(A.find(mp(x,y))==A.end()){ Q.push(mp(x,y)); A.insert(mp(x,y)); } x-=b,y+=a; x-=a,y-=b; x+=k,y+=k; x%=k,y%=k; if(A.find(mp(x,y))==A.end()){ Q.push(mp(x,y)); A.insert(mp(x,y)); } x+=a,y+=b; x-=b,y+=a; x+=k,y+=k; x%=k,y%=k; if(A.find(mp(x,y))==A.end()){ Q.push(mp(x,y)); A.insert(mp(x,y)); } } for(auto p:A){ int x=p.first,y=p.second; x+=b; x%=k; B.insert(mp(x,y)); } for(auto p:A)cout << p.first << " " << p.second << "\n"; for(auto p:B)cout << p.first << " " << p.second << "\n"; } }