#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 1030
using 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 100010
using 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 1000010
using 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 100010
using 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 1000010
using 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 0x3f3f3f3f
using 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 1000010
using 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 15
using 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 1010
using 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 131071
using 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 100010
using 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 100010
using 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 5010
using 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 0x3f3f3f3f
using 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 1000010
using 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值