#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3fffffff;
struct node{
int x,y;
}N[510],ans[510];
bool X(node a,node b,node c){
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
double len(node a,node b){
return sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
}
bool cmp(node a,node b){
int pp = X(N[1],a,b);
if(pp<0)return 0;// 即axb<0 说明a向量在b的逆时针
else if(pp>0)return 1;// 大于零 说明a向量在b的顺时针
else if(pp==0&&len(N[1],b)>len(N[1],a))return 1;
else return 0;
}
int dp[510][510],cost[510][510];
int main()
{
int n,p;
while(~scanf("%d%d",&n,&p))
{
for(int i=1;i<=n;i++)scanf("%d%d",&N[i].x,&N[i].y);
for(int i=2;i<=n;i++){
if(N[i].y<N[1].y)
swap(N[i],N[1]);
else if(N[i].y==N[1].y&&N[i].x<N[1].x)
swap(N[i],N[1]);
}
sort(N+2,N+1+n,cmp);
ans[1]=N[1];
ans[2]=N[2];
int tot=2;
for(int i=3;i<=n;i++){
while(tot>1&&X(ans[tot-1],ans[tot],N[i])<=0)tot--;
tot++;
ans[tot]=N[i];
}
if(tot!=n)puts("I can't cut.");
else{
if(n==3)puts("0");
else{
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j||abs(i-j)==1)dp[i][j]=0;
else dp[i][j]=inf;
cost[i][j]=abs(ans[i].x-ans[j].x)*abs(ans[i].y-ans[j].y)%p;
}
}
//dp[1][n]=dp[n][1]=0;// 1
for(int l=2;l<=n;l++){
for(int i=1;i<=n-l+1;i++){
int j=i+l-1;
for(int k=i+1;k<=j;k++){
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k][j]+cost[i][k] + cost[k][j]);
}
}
}
printf("%d\n",dp[1][n]);
}
}
}
return 0;
}
不知道为什么segment fault啊 感觉数组没问题啊~