求助60分,WA #4 #5

P5343 【XR-1】分块

VinstaG173 @ 2020-01-14 18:24:59

#include<cstdio>
#define ll long long
const int o=1e9+7;
struct Matrix
{
    int v[107][107],n,m;
}M;
Matrix operator *(Matrix a,Matrix b)
{
    Matrix c;c.n=a.n,c.m=b.m;
    for(int i=0;i<a.n;++i)
    {
        for(int j=0;j<b.m;++j)
        {
            c.v[i][j]=0;
            for(int k=0;k<a.m;++k)
            {
                c.v[i][j]=(c.v[i][j]+1ll*a.v[i][k]*b.v[k][j])%o;
            }
        }
    }
    return c;
}
struct Vector
{
    int v[107],n;
}V;
Vector operator *(Vector a,Matrix b)
{
    Vector c;c.n=a.n;
    for(int i=0;i<a.n;++i)
    {
        c.v[i]=0;
        for(int j=0;j<b.n;++j)
        {
            c.v[i]=(c.v[i]+1ll*a.v[j]*b.v[j][i])%o;
        }
    }
    return c;
}
ll N;
int PR,NF,x,maxx;
int can[2][107];
int main()
{
    scanf(" %d",&N);
    scanf(" %d",&PR);
    for(int i=0;i<PR;++i)
    {
        scanf(" %d",&x);can[0][x]=1;(maxx<x)&&(maxx=x);
    }
    scanf(" %d",&NF);
    for(int i=0;i<NF;++i)
    {
        scanf(" %d",&x);can[1][x]=1;(maxx<x)&&(maxx=x);
    }
    M.n=M.m=V.n=maxx;
    for(int i=0;i<maxx;++i)
    {
        x=i+1;
        if(can[0][x]&&can[1][x])M.v[i][0]=1;
        M.v[i][x]=1; 
    }
    V.v[0]=1;
    while(N)
    {
        (N&1)&&(V=V*M,1),M=M*M,N>>=1;
    }
    printf("%d\n",V.v[0]);
    return 0;
}

by AThousandSuns @ 2020-01-14 18:25:38

stO


by 1saunoya @ 2020-01-14 18:26:55

@AThousandSuns Orz


by VinstaG173 @ 2020-01-14 18:30:01

@AThousandSuns @Isaunoya 请不要只%啊,救救蒟蒻啊


by hater @ 2020-01-14 19:07:16

@Isaunoya orz


by Johnsonloy @ 2022-04-29 11:24:44

同样是WA了4,5个点……


|