time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Finally Fox Ciel arrived in front of her castle!

She have to type a password to enter her castle. An input device attached to her castle is a bit unusual.

The input device is a 1 × n rectangle divided into n square panels. They are numbered 1 to n from left to right. Each panel has a state either ON or OFF. Initially all panels are in the OFF state. She can enter her castle if and only if x1-th, x2-th, ..., xk-th panels are in the ON state and other panels are in the OFF state.

She is given an array a1, ..., al. In each move, she can perform the following operation: choose an index i (1 ≤ i ≤ l), choose consecutive ai panels, and flip the states of those panels (i.e. ON → OFF, OFF → ON).

Unfortunately she forgets how to type the password with only above operations. Determine the minimal number of operations required to enter her castle.

Input

The first line contains three integers nk and l (1 ≤ n ≤ 10000, 1 ≤ k ≤ 10, 1 ≤ l ≤ 100), separated by single spaces.

The second line contains k integers x1, ..., xk (1 ≤ x1 < x2 < ... < xk ≤ n), separated by single spaces.

The third line contains l integers a1, ..., al (1 ≤ ai ≤ n), separated by single spaces. It is possible that some elements of the array ai are equal value.

Output

Print the minimal number of moves required to type the password. If it‘s impossible, print -1.

Examples
input
`10 8 21 2 3 5 6 7 8 93 5`
output
`2`
input
`3 2 11 23`
output
`-1`
Note

One possible way to type the password in the first example is following: In the first move, choose 1st, 2nd, 3rd panels and flip those panels. In the second move, choose 5th, 6th, 7th, 8th, 9th panels and flip those panels.

翻译题面：

#### 题目描述

hzwer有一把密码锁，由N个开关组成。一开始的时候，所有开关都是关上的。当且仅当开关x1,x2,x3,...xk为开，其他开关为关时，密码锁才会打开。

【样例输入2】

3 2 1

1 2

3

【样例输出2】

-1

【数据规模】

#### 样例输入 Copy

```10 8 2
1 2 3 5 6 7 8 9
3 5
```

#### 样例输出 Copy

`2题解：`

so，对原序列进行差分，那么每次修改就是要你对i号位置和i+size[]模2意义下的加1。容易看出：差分后的序列中，数值为1的个数是不会超过2k个，即不会超过20个。

```#include<bits/stdc++.h>
using namespace std;
const int M=1e4+5,INF=1<<29;
int n,k,m,cnt;
int a[M],num[M],Dist[25][25],size[M];
int visited[M],Distance[M],f[1<<25];
queue<int> q;
void bfs(int x,int id)
{
memset(visited,0,sizeof(visited));
memset(Distance,0x3f3f3f3f,sizeof Distance);
q.push(x);
visited[x]=1; Distance[x]=0;
while(!q.empty())
{
x=q.front();q.pop();
for(int i=1; i<=m; i++)
{
int tmp=size[i];
if((x+tmp)<=n && !visited[x+tmp])
{
visited[x+tmp]=1;
Distance[x+tmp]=Distance[x]+1;
q.push(x+tmp);
}
if((x-tmp)>=1 && !visited[x-tmp])
{
visited[x-tmp]=1;
Distance[x-tmp]=Distance[x]+1;
q.push(x-tmp);
}
}
}
for(int i=1; i<=cnt; i++)
{
if(visited[num[i]]) Dist[id][i]=Distance[num[i]];
else Dist[id][i]=INF;
}
}
void dp()
{
for(int i=1; i<(1<<cnt); i++) f[i]=INF;
for(int i=0,j; i<(1<<cnt); i++)
{
for(int k=1; k<=cnt; k++)
if((1<<k-1)&i)
{
j=k;
break;
}
for(int k=1; k<=cnt; k++)
if((1<<k-1)&i)
f[i]=min(f[i],f[i^(1<<j-1)^(1<<k-1)]+Dist[j][k]);
}
}
int main()
{
scanf("%d%d%d",&n,&k,&m);
for(int i=1; i<=k; i++)
{
int x; scanf("%d",&x);
a[x]=1;
}
for(int i=1; i<=m; i++) scanf("%d",&size[i]);
for(int i=++n; i>=1; i--) a[i]^=a[i-1];
for(int i=1; i<=n; i++)
if(a[i])
{
a[i]=++cnt;
num[cnt]=i;
}
for(int i=1; i<=n; i++)
if(a[i]) bfs(i,a[i]);
dp();
if(f[(1<<cnt)-1]==INF) puts("-1");
else printf("%d\n",f[(1<<cnt)-1]);
return 0;
}
```

2020-02-1415:38:47