#include<bits/stdc++.h> #define alpha 5 using namespace std; using pi=pair<int,int>; int n,m; int tt; int dist(pi a,pi b){ int res=(a.first-b.first)*(a.first-b.first); res+=(a.second-b.second)*(a.second-b.second); return res; } vector<pi> x; pi g[111][111]; void init_g(){ for(int i=0;i<tt;i++){ for(int j=0;j<tt;j++){ if(i==j){g[i][j]={0,i};} else{g[i][j]={1e9,-1};} } } } void gen_g(){ for(int k=0;k<tt;k++){ for(int i=0;i<tt;i++){ for(int j=0;j<tt;j++){ if(g[i][j].first>g[i][k].first+g[k][j].first){ g[i][j].first=g[i][k].first+g[k][j].first; g[i][j].second=g[i][k].second; } } } } } bool distinct(int a,int b,int c,int d){ if(a==b){return false;} if(a==c){return false;} if(a==d){return false;} if(b==c){return false;} if(b==d){return false;} if(c==d){return false;} return true; } int output_dis; vector<pi> output_coord; vector<int> output_route; int solve(mt19937_64 &eg){ vector<int> p(n); for(int i=0;i<n;i++){p[i]=i;} shuffle(p.begin()+1,p.end(),eg); p.push_back(0); for(int tr=0;tr<1000;tr++){ for(int i=0;i<n;i++){ for(int j=i+2;j<n;j++){ int ni=p[i+1]; int nj=p[j+1]; if(!distinct(i,j,ni,nj)){continue;} int bef=g[i][ni].first+g[j][nj].first; int aft=g[i][j].first+g[ni][nj].first; if(bef>aft){ int l=(i+1)%n; int r=j; while(l<r){ swap(p[l],p[r]); l++;r--; } } } } } int res=0; for(int i=0;i<n;i++){ res+=g[p[i]][p[i+1]].first; } if(output_dis>res){ output_dis=res; for(int i=n;i<n+m;i++){output_coord[i-n]=x[i];} output_route.clear(); int cp=p[0]; for(int i=0;i<n;i++){ while(cp!=p[i+1]){ output_route.push_back(cp); cp=g[cp][p[i+1]].second; } } output_route.push_back(p[n]); } return res; } int main(){ random_device seed_gen; mt19937_64 engine(seed_gen()); ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; output_dis=2e9; output_coord.resize(m); tt=n+m; x.resize(n+m); for(int i=0;i<n;i++){ cin >> x[i].first >> x[i].second; } double deg=(2.0*3.1415926535897932384)/((double)m); for(int i=n;i<n+m;i++){ x[i].first=(int)(500.5+300.0*cos(deg*((double)i-n))); x[i].second=(int)(500.5+300.0*sin(deg*((double)i-n))); cerr << x[i].first << ' ' << x[i].second << '\n'; } for(int tr=0;tr<1;tr++){ for(int i=0;i<tt;i++){ for(int j=0;j<tt;j++){ int ce=1; if(i<n){ce*=alpha;} if(j<n){ce*=alpha;} g[i][j]={ce*dist(x[i],x[j]),j}; } } gen_g(); solve(engine); } cerr << output_dis << "\n"; for(auto &nx : output_coord){ cout << nx.first << ' ' << nx.second << '\n'; } cout << output_route.size() << '\n'; for(auto &nx : output_route){ if(nx<n){ cout << "1 " << nx+1 << "\n"; } else{ cout << "2 " << nx-n+1 << "\n"; } } return 0; }