来源:互联网 发布:网络爬虫作用 编辑:程序博客网 时间:2024/06/10 03:09
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#include<queue>#define ll long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define et(i,x) for(int i=ls[x];i;i=e[i].p)#define maxx(a,b) a=max(a,b);#define minn(a,b) a=min(a,b);#define fil(a,x) memset(a,x,sizeof(a));#define N 6010#define K 1030using namespace std;int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(int x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}int n,m,k,r[N],ls[N],cnt=0,dis[N][K];struct edge{    int f,t,p,key;}e[N];void add(int x,int y,int z){    e[++cnt].t=y,e[cnt].f=x,e[cnt].p=ls[x],ls[x]=cnt,e[cnt].key=z;}struct node{    int x,key;    bool operator<(const node &a)const    {        return dis[x][key]>dis[a.x][a.key];    }};int dijkstra(){    fo(i,1,n)        fo(j,0,1<<k)            dis[i][j]=0x3f3f3f3f;    queue<node>q;    dis[1][0]=0;    q.push((node){1,0});    while(!q.empty())    {        node u=q.front();        q.pop();        int ke=u.key|r[u.x];        et(i,u.x)            if((ke|e[i].key)==ke&&dis[u.x][u.key]+1<dis[e[i].t][ke])                {                    dis[e[i].t][ke]=dis[u.x][u.key]+1;                    q.push((node){e[i].t,ke});                }    }    int ans=0x3f3f3f3f;    fo(i,0,1<<k)        minn(ans,dis[n][i]);    return ans;}int main(){    n=read(),m=read(),k=read();    fo(i,1,n)    {        int t=0;        fo(j,1,k)        {            int x=read();            t=t*2+x;        }        r[i]=t;    }       fo(i,1,m)    {        int x=read(),y=read(),t=0;        fo(j,1,k)        {            int z=read();            t=t*2+z;        }        add(x,y,t);    }    int ans=dijkstra();    if(ans==0x3f3f3f3f) puts("No Solution");    else write(ans);    return 0;}
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#define ll long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define et(i,x) for(int i=ls[x];i;i=e[i].p)#define maxx(a,b) a=max(a,b);#define minn(a,b) a=min(a,b);#define fil(a,x) memset(a,x,sizeof(a));#define N 10000010#define Q 100010using namespace std;int read(){    ll x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(ll x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}ll q,a[Q][2],prime[N],tot=0,m=0,sum[N];bool b[N],c[N],f[N];void init(){    fo(i,2,m)    {        if(!f[i])        {            prime[++tot]=i;            b[i]=1;        }        fo(j,1,tot)        {            ll t=i*prime[j];            if(t>m) break;            f[t]=1;            if(b[i])                c[t]=1;            if(i%prime[j]==0) break;        }    }}int main(){    q=read();    fo(i,1,q)    {        a[i][0]=read(),a[i][1]=read();        maxx(m,a[i][1]);    }    init();     fo(i,1,m)    {        if(b[i]) sum[i]=sum[i-1]+b[i];        else sum[i]=sum[i-1]+c[i];    }    fo(i,1,q)    {        write(sum[a[i][1]]-sum[a[i][0]-1]);        putchar('\n');    }    return 0;}
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#define ll long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define et(i,x) for(int i=ls[x];i;i=e[i].p)#define maxx(a,b) a=max(a,b);#define minn(a,b) a=min(a,b);#define fil(a,x) memset(a,x,sizeof(a));#define N 1000010using namespace std;int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(int x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}int n,m,h[N],c[N],ans=0;void ins(int x,int y){    while(x<=n) c[x]+=y,x+=x&-x;}int find(int x){    int ans=0;    while(x) ans+=c[x],x-=x&-x;    return ans;}pair<int,int> getpos(int x){    pair<int,int>re;    int l=1,r=n;    while(l<=r)    {        int mid=(l+r)>>1;        if(find(mid)<=x) r=mid-1;        else l=mid+1;    }    re.first=r+1;    l=1,r=n;    while(l<=r)    {        int mid=(l+r)>>1;        if(find(mid)>=x) l=mid+1;        else r=mid-1;    }    re.second=l-1;    return re;}int main(){    n=read(),m=read();    fo(i,1,n) h[i]=read();    sort(h+1,h+1+n);    fd(i,n,1) ins(n-i+1,h[i]),ins(n-i+2,-h[i]);    fo(i,1,m)    {        int x=read(),y=find(x);        if(x>n||!y) break;        pair<int,int>p=getpos(y);        ins(1,-1); ins(p.first,1);        ins(p.second-x+p.first,-1); ins(p.second+1,1);        ans=i;    }    write(ans);    return 0;}
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#define ll long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define et(i,x) for(int i=ls[x];i;i=e[i].p)#define maxx(a,b) a=max(a,b);#define minn(a,b) a=min(a,b);#define fil(a,x) memset(a,x,sizeof(a));#define N 100010using namespace std;int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(int x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}int n,t[N*4],ans[N];struct data{    int a,b;    bool operator<(const data &x)const    {        return a<x.a;    }}a[N];void build(int x,int l,int r){    t[x]=r-l+1;    if(l==r) return;    int mid=(l+r)>>1;    build(x<<1,l,mid);    build(x<<1|1,mid+1,r);}void ins(int x,int l,int r,int k,int v){    t[x]--;    if(l==r)    {        ans[l]=v;        return;    }    int mid=(l+r)>>1;    if(t[x<<1]>=k) ins(x<<1,l,mid,k,v);    else ins(x<<1|1,mid+1,r,k-t[x<<1],v);}int main(){    n=read();    fo(i,1,n) a[i]=(data){read(),read()};    sort(a+1,a+1+n);    build(1,1,n);    fo(i,1,n)    {        /*if(a[i].b>=n-i+1)        {            puts("impossible");            return 0;        }        int k=min(a[i].b+1,n-i+1-a[i].b);        ins(1,1,n,k,a[i].a);*/         int k=min(a[i].b,n-i-a[i].b);        if(k<0)        {            puts("impossible");            return 0;        }        ins(1,1,n,k+1,a[i].a);    }    fo(i,1,n) write(ans[i]),putchar(' ');    return 0;}
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#define ll long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define et(i,x) for(int i=ls[x];i;i=e[i].p)#define maxx(a,b) a=max(a,b);#define minn(a,b) a=min(a,b);#define fil(a,x) memset(a,x,sizeof(a));#define N 1000010using namespace std;int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(int x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}int t,n,k,ls[N*2],c=0,f[N][2];struct edge{    int t,p;}e[N*2];void add(int x,int y){    e[++c].t=y,e[c].p=ls[x],ls[x]=c;}void dfs(int x,int fa){    et(i,x)        if(e[i].t!=fa)        {            dfs(e[i].t,x);            f[x][0]+=f[e[i].t][1];        }    et(i,x)        if(e[i].t!=fa)            maxx(f[x][1],f[x][0]-f[e[i].t][1]+f[e[i].t][0]+1);}int main(){    t=read();    while(t--)    {        fil(f,0);        fil(ls,0);        c=0;        n=read(),k=read();        fo(i,1,n-1)        {            int x=i+1,y=read();            add(x,y);            add(y,x);        }        dfs(1,0);        int ans=max(f[1][0],f[1][1]);        if(ans*2>=k) write((k+1)/2);        else write(ans+(k-ans*2));        putchar('\n');    }    return 0;}
#include<cstring>#include<cstdio>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fil(a,x) memset(a,x,sizeof(a));#define min(a,b) a<b?a:b#define minn(a,b) a=min(a,b);#define N 55#define INF 0x3f3f3f3fusing namespace std;int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(int x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}inline int sqr(int x){    return x*x;}int n,m,h[N][N],k,f[N][N][5010],ans=INF;int main(){    n=read(),m=read();    k=n+m-1;    fo(i,1,n)        fo(j,1,m)            h[i][j]=read();                 fil(f,0x3f);    f[1][1][h[1][1]]=(k-1)*sqr(h[1][1]);    fo(i,1,n)        fo(j,1,m)            fo(sum,0,5000)            {                if(f[i][j][sum]==INF) continue;                if(sum+h[i][j+1]<=5000) minn(f[i][j+1][sum+h[i][j+1]],f[i][j][sum]+k*sqr(h[i][j+1])+sqr(sum)-sqr(sum+h[i][j+1]));                if(sum+h[i+1][j]<=5000) minn(f[i+1][j][sum+h[i+1][j]],f[i][j][sum]+k*sqr(h[i+1][j])+sqr(sum)-sqr(sum+h[i+1][j]));            }    fo(i,0,5000) minn(ans,f[n][m][i]);    write(ans);    return 0;}
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<queue>#include<algorithm>#define ll long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define et(i,x) for(int i=last[x];i;i=e[i].p)#define maxx(a,b) a=max(a,b);#define minn(a,b) a=min(a,b);#define fil(a,x) memset(a,x,sizeof(a));#define N 1000010using namespace std;int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(int x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}int n,m,st[N],t,stack[N],top=0,dfn[N],low[N],pos[N],ind[N],now=0,last[N],cnt=0,bel[N],size[N],num,a[N],ans=0,f[N];bool inst[N],vis[N];struct edge{    int f,t,p;}e[N*2];inline void add(int x,int y) {    e[++cnt].f=x;    e[cnt].t=y;    e[cnt].p=last[x];    last[x]=cnt;}void init(){    n=read(),m=read();    fo(i,1,m)    {        int x=read(),y=read();        add(x,y);    }}void tarjan(int x){    st[t=1]=x;    while(t)    {        int u=st[t],start=last[u];        if(pos[t])        {            start=pos[t],minn(low[u],low[e[start].t]);        }        else        {            stack[++top]=u;            low[u]=dfn[u]=++now;            inst[u]=1;        }        bool b=0;        for(int i=start;i;i=e[i].p)        {            int v=e[i].t;            if(!dfn[v])            {                pos[t]=i;                st[++t]=v;                b=1;                break;            }            else if(inst[v]) minn(low[u],dfn[v]);        }        if(b) continue;        if(low[u]==dfn[u])        {            num++;            stack[top+1]=0;            for(;stack[top+1]!=u;top--) inst[stack[top]]=0,bel[stack[top]]=num,size[num]++;        }        pos[t--]=0;    }}queue<int>q;void toposort(){    a[0]=0;    fo(i,1,num) if(!ind[i]) q.push(i);    while(!q.empty())    {        int u=q.front();        q.pop();        a[++a[0]]=u;        et(i,u)        {            ind[e[i].t]--;            if(!ind[e[i].t]) q.push(e[i].t);        }    }}int main(){    init();    fo(i,1,n) if(!dfn[i]) tarjan(i);        fo(i,1,n) last[i]=0;    fo(i,1,m)    {        int x=e[i].f,y=e[i].t;        if(bel[x]!=bel[y]) add(bel[x],bel[y]),ind[bel[y]]++;    }    toposort();    fo(i,1,num)    {        int x=a[i];        maxx(ans,f[x]+=size[x])        et(j,x) maxx(f[e[j].t],f[x]);    }       write(ans);    return 0;}
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#define ll long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define et(i,x) for(int i=last[x];i;i=e[i].p)#define maxx(a,b) a=max(a,b);#define minn(a,b) a=min(a,b);#define fil(a,x) memset(a,x,sizeof(a));#define N 100010#define M 15using namespace std;int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(int x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}ll f[N][M];int g[N][M],n,m;ll calc(int i,int j,int k){    return 2*f[k][j]+f[i-k][j-1];}int main(){    n=read(),m=read();    fo(i,1,n)    {        f[i][3]=2*f[i-1][3]+1;        fo(j,4,m)        {            f[i][j]=(ll)1e18;            if(i<j) f[i][j]=2*i-1;            else            {                f[i][j]=calc(i,j,g[i][j]=g[i-1][j]);                ll t=calc(i,j,g[i-1][j]+1);                if(t<f[i][j])                {                    g[i][j]++;                    f[i][j]=t;                }            }        }    }    write(f[n][m]);    return 0;}
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#define ll long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define et(i,x) for(int i=last[x];i;i=e[i].p)#define maxx(a,b) a=max(a,b);#define minn(a,b) a=min(a,b);#define fil(a,x) memset(a,x,sizeof(a));#define N 1010using namespace std;int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(int x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}int n,m,ans=0,sum[N],a[N][N];int main(){    n=read(),m=read();      fo(i,1,n)        fo(j,1,m)        {            a[i][j]=read();            if(a[i][j]>0)            {                a[i][j]=1;                sum[i]++;            }            else a[i][j]=0;        }           fo(j,1,m)        if(a[1][j]==0)        {            ans++;            fo(i,1,n)            {                if(a[i][j]==1) sum[i]--; else sum[i]++;                 a[i][j]^=1;            }        }    fo(i,1,n)                   if(sum[i]==0) ans++;        else if(sum[i]!=m)        {            puts("impossible");            return 0;        }    minn(ans,n+m-ans);    write(ans);    return 0;}
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#define ll long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define et(i,x) for(int i=last[x];i;i=e[i].p)#define maxx(a,b) a=max(a,b);#define minn(a,b) a=min(a,b);#define fil(a,x) memset(a,x,sizeof(a));#define N 100010#define P 131071using namespace std;int read(){    ll x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(ll x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}ll prime[N],fact[N],a[N],inv[N],len,n,m,t;bool b[N];void pre(){    fact[1]=1;    fo(i,2,N) fact[i]=fact[i-1]*i%P;    fo(i,2,N)    {        if(!b[i]) prime[++len]=i;        fo(j,1,len)        {            if(i*prime[j]>N) break;            b[i*prime[j]]=1;            if(i%prime[j]==0) break;        }    }    inv[1]=1;    fo(i,2,N)        inv[i]=(P-P/i)* inv[P%i]%P;    a[1]=1;    fo(i,2,N)        if(!b[i]) a[i]=a[i-1]*(i-1)*inv[i]%P;        else a[i]=a[i-1];}int main(){    pre();    t=read();    while(t--)    {        n=read(),m=read();        ll ans=fact[n]*a[m]%P;        write(ans),putchar('\n');    }    return 0;}
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#include<queue>#define ll long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define et(i,x) for(int i=last[x];i;i=e[i].p)#define maxx(a,b) a=max(a,b);#define minn(a,b) a=min(a,b);#define fil(a,x) memset(a,x,sizeof(a));#define N 100010using namespace std;int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(int x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}int n,m,ind[N],last[N],cnt=0,sum=0,a[N];struct edge{    int t,p;}e[N];void add(int x,int y){    e[++cnt]=(edge){y,last[x]},last[x]=cnt;    ind[y]++;}priority_queue<int,vector<int>,greater<int> >q;int main(){    n=read(),m=read();    fo(i,1,m)    {        int x=read(),y=read();        add(x,y);    }    fo(i,1,n)        if(ind[i]==0) q.push(i),sum++;    while(!q.empty())    {        int x=q.top();        q.pop();        a[++a[0]]=x;        et(i,x)        {            ind[e[i].t]--;            if(ind[e[i].t]==0) q.push(e[i].t),sum++;        }    }    if(sum<n) write(-1);    else fo(i,1,n) write(a[i]),putchar(' ');    return 0;}
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#define ll long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define et(i,x) for(int i=last[x];i;i=e[i].p)#define maxx(a,b) a=max(a,b);#define minn(a,b) a=min(a,b);#define fil(a,x) memset(a,x,sizeof(a));#define N 100010using namespace std;ll read(){    ll x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(ll x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}int n,m;ll ta[N],tb[N];struct ob{    ll a,b;    bool operator<(const ob &x)const    {        return a>x.a||a==x.a&&b>x.b;    }}a[N];int main(){    n=read(),m=read();    fo(i,1,n) a[i]=(ob){read(),read()};    sort(a+1,a+1+n);        fo(i,1,n)    {        ta[i]=ta[i-1]+a[i].a;        tb[i]=tb[i-1]+a[i].b;    }       fo(i,1,m)    {        ll x=read(),l=1,r=n,b,e,ans=0;        bool f=1;        while(f)        {            f=0;            while(l<=r)            {                ll mid=(l+r)>>1;                if(a[mid].a<=x)                {                       f=1;                    b=mid;                    r=mid-1;                }                else l=mid+1;            }            if(!f) break;            l=b+1,r=n,e=b;            while(l<=r)            {                ll mid=(l+r)>>1;                if(ta[mid]-ta[b-1]<=x)                {                    e=mid;                    l=mid+1;                }                else r=mid-1;            }            x-=ta[e]-ta[b-1];            ans+=tb[e]-tb[b-1];            l=e+1,r=n;        }        write(ans),putchar('\n');    }    return 0;}
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#define ll long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define et(i,x) for(int i=last[x];i;i=e[i].p)#define maxx(a,b) a=max(a,b);#define minn(a,b) a=min(a,b);#define fil(a,x) memset(a,x,sizeof(a));#define N 1010#define M 5010using namespace std;int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(int x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}int n=0,m,a[N],f[N][M];int get(int l,int r){    int re=0;    fo(i,l,r)        re=10*re+a[i];    return re;}int main(){    for(char ch=getchar();ch!='=';a[++n]=ch-'0',ch=getchar());    m=read();    fil(f,63);    f[0][0]=-1;    fo(i,1,n)        fo(j,0,m)            fo(k,max(1,i-3),i)            {                int num=get(k,i);                if(j>=num) minn(f[i][j],f[k-1][j-num]+1);            }    write(f[n][m]);    return 0;}
#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define minn(a,b) a=min(a,b);#define fil(a,x) memset(a,x,sizeof(a));#define N 2010#define INF 0x3f3f3f3fusing namespace std;int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(int x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}int n,a[N],f[N][N],ans=INF;int main(){    n=read();    fo(i,1,n) a[i]=read();    fil(f,0x3f);        f[1][2]=a[2];    fo(i,1,n)        fd(j,n,1)        {            if(j-i>=1) minn(f[i][j-i],f[i][j]+a[j-i]);            if(i+j+1<=n) minn(f[i+1][j+i+1],f[i][j]+a[j+i+1]);        }    fo(i,1,n) minn(ans,f[i][n]);    write(ans);    return 0;}
#include<cstdio>#define fo(i,a,b) for(int i=a;i<=b;i++)#define N 1000010using namespace std;int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}void write(int x){    if(x<0) putchar('-'),x=-x;    if(x>9) write(x/10);    putchar(x%10+'0');}int n,m,a[N],b[N],next[N];void init(){    n=read(),m=read();    fo(i,1,n) a[i]=read();    fo(i,1,n-1) a[i]=a[i+1]-a[i];    fo(i,1,m) b[i]=read();    fo(i,1,m-1) b[i]=b[i+1]-b[i];    n--,m--;}int kmp(){    int j=0,ans=0;    fo(i,2,m)     {        while(b[i]!=b[j+1]&&j!=0) j=next[j];        if(b[i]==b[j+1]) j++;        next[i]=j;    }    j=0;    fo(i,1,n)    {        while(a[i]!=b[j+1]&&j!=0) j=next[j];        if(a[i]==b[j+1]) j++;        if(j==m)        {            ans++;            j=next[j];        }    }    return ans;}int main(){    init();     write(kmp());    return 0;}