//差分約束系統 #include <bits/stdc++.h> using namespace std; #define INF 1044266558 struct node{ int to,w,next; }e[5006]; map<int,int>m; int head[1006],in[1006],vis[1006],dis[1006]; int a[1006],ans,t,n,d; void add_edge(int u,int v,int w){ e[ans].to=v; e[ans].w=w; e[ans].next=head[u]; head[u]=ans++; } int bfs(int s){ dis[s]=0; in[s]=1; queue<int>q; q.push(s); while(!q.empty()){ int v=q.front(); q.pop(); if(vis[v]>n) return 1; in[v]=0; for(int i=head[v];i!=-1;i=e[i].next){ int u=e[i].to; int w=e[i].w; if(dis[u]>dis[v]+w){ dis[u]=dis[v]+w; vis[u]++; if(!in[u]){ in[u]=1; q.push(u); } } } } return 0; } int main(){ scanf("%d",&t); int o=t; while(t--){ scanf("%d%d",&n,&d); memset(dis,62,sizeof(dis)); memset(head,-1,sizeof(head)); memset(in,0,sizeof(in)); memset(vis,0,sizeof(vis)); m.clear(); ans=0; for(int i=0;i<n;i++){ scanf("%d",&a[i]); m[a[i]]=i+1; } sort(a,a+n); for(int i=0;i<n-1;i++){ int u=m[a[i]],v=m[a[i+1]]; if(u>v) swap(u,v); add_edge(u,v,d); } for(int i=1;i<=n-1;i++) add_edge(i+1,i,-1); printf("Case %d: ",o-t); if(bfs(min(m[a[0]],m[a[n-1]]))) printf("-1\n"); else printf("%d\n",dis[max(m[a[n-1]],m[a[0]])]); } return 0; }