#include<bits/stdc++.h>
using namespace std;

#define int long long

typedef vector<int>vint;
typedef pair<int,int>pint;
typedef vector<pint>vpint;
#define rep(i,n) for(int i=0;i<(n);i++)
#define reps(i,f,n) for(int i=(f);i<(n);i++)
#define all(v) (v).begin(),(v).end()
#define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define fi first
#define se second
template<typename A,typename B>inline void chmin(A &a,B b){if(a>b)a=b;}
template<typename A,typename B>inline void chmax(A &a,B b){if(a<b)a=b;}

struct UnionFindTree{
    vector<int>par,sz;
    UnionFindTree(int n){
        par.resize(n);
        sz.resize(n);
        for(int i=0;i<n;i++){
            par[i]=i;
            sz[i]=1;
        }
    }
    int find(int x){
        return x==par[x]?x:par[x]=find(par[x]);
    }
    void unite(int x,int y){
        x=find(x);y=find(y);
        if(x==y)return;
        if(sz[x]<sz[y])swap(x,y);
        sz[x]+=sz[y];
        par[y]=x;
    }
    bool areSame(int x,int y){
        return find(x)==find(y);
    }
    int size(int x){
        return sz[find(x)];
    }
};

int d[]={1,-1,7,-7};

int N,M,Q;
bool f[700000*2];

int a[111111];

int calc(int m){
    memset(f,0,sizeof(f));
    for(int i=0;i<Q;i++){
        for(int j=a[i];j<m;j+=M)f[j]=true;
    }

    UnionFindTree uf(m);

    rep(i,m){
        rep(j,4){
            if(i%7==0&&d[j]==-1)continue;
            if(i%7==6&&d[j]==1)continue;
            int nx=i+d[j];
            if(nx<0||nx>=m)continue;
            if(f[i]||f[nx])continue;
            uf.unite(i,nx);
        }
    }
    int res=0;
    rep(i,m)if(!f[i]&&uf.find(i)==i)res++;
    return res;
}

signed main(){
    cin>>N>>M>>Q;
    int MM=M;
    if(M%7)MM*=7;
    rep(i,Q){
        cin>>a[i];
    }

    int x=calc(MM);
    int y=calc(2*MM);
    cout<<x+(y-x)*(N*7/MM-1)<<endl;
    return 0;
}

### Prompt

Please formulate a Cpp solution to the following problem:

Input Format

The input format is following:



n m q
a_1 a_2 ... a_q


Output Format

Print the number of connected part in one line.


Constraints

* n ≤ 10^{12}
* 7n is divisible by m.
* 1 ≤ q ≤ m ≤ 10^5
* 0 ≤ a_1 < a_2 < ... < a_q < m



Scoring

Subtask 1 [100 points]


* n ≤ 100000.

Subtask 2 [90 points]


* m is divisible by 7.
* a_{i + 1} - a_i = 1.

Subtask 3 [200 points]


* m is divisible by 7.

Subtask 4 [110 points]


* There are no additional constraints.



Sample Input 1


7 7 3
1 3 5


Sample Output 1


4


The calendar looks like this:


<image>

Sample Input 2


10 14 8
5 6 7 8 9 10 11 12


Sample Output 2


10


The calendar looks like this:


<image>

Output Format

Print the number of connected part in one line.


Constraints

* n ≤ 10^{12}
* 7n is divisible by m.
* 1 ≤ q ≤ m ≤ 10^5
* 0 ≤ a_1 < a_2 < ... < a_q < m



Scoring

Subtask 1 [100 points]


* n ≤ 100000.

Subtask 2 [90 points]


* m is divisible by 7.
* a_{i + 1} - a_i = 1.

Subtask 3 [200 points]


* m is divisible by 7.

Subtask 4 [110 points]


* There are no additional constraints.

Input Format

The input format is following:



n m q
a_1 a_2 ... a_q

Examples

Input

7 7 3
1 3 5


Output

4


Input

10 14 8
5 6 7 8 9 10 11 12


Output

10

### Response

```cpp
#include<bits/stdc++.h>
using namespace std;

#define int long long

typedef vector<int>vint;
typedef pair<int,int>pint;
typedef vector<pint>vpint;
#define rep(i,n) for(int i=0;i<(n);i++)
#define reps(i,f,n) for(int i=(f);i<(n);i++)
#define all(v) (v).begin(),(v).end()
#define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define fi first
#define se second
template<typename A,typename B>inline void chmin(A &a,B b){if(a>b)a=b;}
template<typename A,typename B>inline void chmax(A &a,B b){if(a<b)a=b;}

struct UnionFindTree{
    vector<int>par,sz;
    UnionFindTree(int n){
        par.resize(n);
        sz.resize(n);
        for(int i=0;i<n;i++){
            par[i]=i;
            sz[i]=1;
        }
    }
    int find(int x){
        return x==par[x]?x:par[x]=find(par[x]);
    }
    void unite(int x,int y){
        x=find(x);y=find(y);
        if(x==y)return;
        if(sz[x]<sz[y])swap(x,y);
        sz[x]+=sz[y];
        par[y]=x;
    }
    bool areSame(int x,int y){
        return find(x)==find(y);
    }
    int size(int x){
        return sz[find(x)];
    }
};

int d[]={1,-1,7,-7};

int N,M,Q;
bool f[700000*2];

int a[111111];

int calc(int m){
    memset(f,0,sizeof(f));
    for(int i=0;i<Q;i++){
        for(int j=a[i];j<m;j+=M)f[j]=true;
    }

    UnionFindTree uf(m);

    rep(i,m){
        rep(j,4){
            if(i%7==0&&d[j]==-1)continue;
            if(i%7==6&&d[j]==1)continue;
            int nx=i+d[j];
            if(nx<0||nx>=m)continue;
            if(f[i]||f[nx])continue;
            uf.unite(i,nx);
        }
    }
    int res=0;
    rep(i,m)if(!f[i]&&uf.find(i)==i)res++;
    return res;
}

signed main(){
    cin>>N>>M>>Q;
    int MM=M;
    if(M%7)MM*=7;
    rep(i,Q){
        cin>>a[i];
    }

    int x=calc(MM);
    int y=calc(2*MM);
    cout<<x+(y-x)*(N*7/MM-1)<<endl;
    return 0;
}

```