#include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; #define LL long long const LL inf = 1234567899ll * 1234567890; int mod; int n; struct point{ int x, y; point(){} point(int _x, int _y) : x(_x), y(_y){} bool operator < (const point &cmp) const{ if(x == cmp.x) return y < cmp.y; return x < cmp.x; } } p[345], ch[345]; int f[333][333]; LL dp[333][333]; point operator - (point a, point b) {return point(a.x-b.x, a.y-b.y);} int Cross(point a, point b){ return a.x*b.y-b.x*a.y; } int ConvexHull(){ sort(p, p+n); int ret = 0; for(int i = 0; i < n; i ++){ while(ret > 1 && Cross(ch[ret-1]-ch[ret-2], p[i]-ch[ret-2]) <= 0) ret --; ch[ret++] = p[i]; } int k = ret; for(int i = n-2; i >= 0; i --){ while(ret > k && Cross(ch[ret-1]-ch[ret-2], p[i]-ch[ret-2]) <= 0) ret --; ch[ret++] = p[i]; } if(n > 1) ret --; return ret; } int Cost(point a, point b){ return abs(a.x+b.x) * abs(a.y+b.y) % mod; } LL minl(LL a, LL b) {return a < b ? a : b;} int main(){ while(scanf("%d%d", &n, &mod) != EOF){ for(int i = 0; i < n; i ++){ scanf("%d%d", &p[i].x, &p[i].y); } int ret = ConvexHull(); if(ret != n) printf("I can't cut. "); else{ for(int i = 0; i < n; i ++){ for(int j = i+1; j < n; j ++) f[j][i] = f[i][j] = Cost(ch[i], ch[j]); } for(int i = 0; i < n; i ++) for(int j = 0; j < n; j ++) dp[i][j] = inf; for(int i = 0; i < 2; i ++) for(int j = 0; j < n; j ++) dp[j][(j+i)%n] = 0; for(int i = 2; i < n-1; i ++){ for(int j = 0; j < n; j ++){ dp[j][(j+i)%n] = minl(dp[j][(j+i)%n], minl(dp[j][(j+i-1)%n] + f[j][(j+i)%n], dp[(j+1)%n][(j+i)%n] + f[j][(j+i)%n])); } } //for(int i = 0; i < n; i ++) {for(int j = 0; j < n; j ++) printf("%I64d ", dp[i][j]); printf(" ");} for(int i = 0; i < n; i ++){ for(int j = 2; j < n; j ++){ for(int o = j+2; o < n; o ++){ int jj = (i+j)%n ; int oo = (i+o)%n; if(o == n-1) dp[i][oo] = minl(dp[i][oo], dp[i][jj] + dp[jj][oo]); else dp[i][oo] = minl(dp[i][oo], dp[i][jj] + dp[jj][oo] + f[i][oo]); // printf("%d %d %d ", i, oo, dp[i][oo]); } } } LL mn = inf; for(int i = 0; i < n; i ++) mn = minl(dp[i][(i+n-2)%n], mn); printf("%lld ", mn); } } return 0; } /* 6 123 2 2 3 2 2 4 3 4 1 3 4 3 */