/kel,调了我一整个模拟赛
#include<bits/stdc++.h>
using namespace std;
const int N=20,K=100005;
/*
5e8,会赢吗
怎么还卡空间的
*/
int n,k,cnt;
int arr[N],tot[N],G[K*N][N],id[K*N][N];
int first[N][N],frm[K];
struct Node {
int lst,nxt,id;
}List[N*N*K];
int ndcnt;
bool vis[N];
bool dfs(int u,int p) {
vis[u]=1;int v;
if(tot[u]>=k) {
for(int i=1;i<=n;++i) {
if(!vis[i] && first[u][i]) {
if(dfs(i,List[first[u][i]].id)) {
--tot[u];
goto end;
}
}
}
return 0;
}
end:
for(int i=1;i<=n;++i) {
if(G[p][i]) {
if(id[p][i]) {
v=id[p][i];
if(frm[p] && first[frm[p]][i]==v)
first[frm[p]][i]=List[v].nxt;
List[List[v].lst].nxt=List[v].nxt;
List[List[v].nxt].lst=List[v].lst;
List[v]={0,0,p};
}else {v=id[p][i]=++ndcnt;List[v].id=p;}
List[v].nxt=first[u][i];
List[first[u][i]].lst=v;
first[u][i]=v;
}
}
frm[p]=u,tot[u]++;
return 1;
}
int main() {
cin >> n >> k;
for(int i=1;i<=n;++i) cin >> arr[i];
int flow=n*k;
for(int d=1;;++d) {
++cnt;
memset(G[cnt],0,sizeof(G[cnt]));
for(int i=1;i<=n;++i)
if(((d-1)/arr[i])%2==0) G[cnt][i]=1;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;++i) {
if(G[cnt][i] && dfs(i,cnt)) {
flow--;
goto GG;
}
}
--cnt;continue;
GG:
if(!flow) {
//for(int i=1;i<=n;++i) cout << tot[i] << ' ';
//cout << endl;
cout << d << '\n';
break;
}
//if(flow%10000==0) cout << d << ' ' << flow << ' ' << ndcnt << ' ' << cnt << '\n';
}
return 0;
}