#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.\n");
        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("\n");}
            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\n", 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\n", mn);
        }
    }
    return 0;
}

/*
6 123
2 2 3 2 2 4 3 4 1 3 4 3
   */

  

posted on 2015-05-01 23:08  ACMood  阅读(118)  评论(0编辑  收藏  举报