[Luogu P5678][GZOI2017]河神

\(GZOI2017D2T1\)

题目链接?不存在的Luogu P5678 [GZOI2017]河神

题面

往拆位想了半天,问了问yhj神仙发现这就一sb题。。

虽然我也不会证明,但是这题直接矩阵乘法模拟就可以过了。。

细节见代码。

时间复杂度 \(O(K^3\log N)\)

代码:

#include <cstdio>
#include <cstring>
#define rint register int
typedef unsigned long long ull;

int N,K;
struct Matrix
{
    ull a[105][105];
    inline Matrix(){memset(a,0,sizeof a);}

    inline Matrix operator*(const Matrix &o)const
    {
        Matrix Res;
        for(rint i=0;i<K;++i)
            for(rint k=0;k<K;++k)
                for(rint j=0;j<K;++j)
                    Res.a[i][j]|=a[i][k]&o.a[k][j];
        return Res;
    }

    inline Matrix operator^(int p)const
    {
        Matrix Res(*this),Pow(*this);
        for(--p;p;p>>=1,Pow=Pow*Pow)if(p&1)Res=Res*Pow;
        return Res;
    }
}A,B;

int main()
{
    scanf("%d%d",&N,&K);
    for(int i=0;i<K;++i)scanf("%llu",&A.a[0][i]);
    for(int i=1;i<K;++i)B.a[i][i-1]=~0ull;
    for(int i=0;i<K;++i)scanf("%llu",&B.a[i][K-1]);
    printf("%llu\n",(A*(B^N)).a[0][0]);
    return 0;
}
posted @ 2019-11-21 20:38  LanrTabe  阅读(228)  评论(0编辑  收藏  举报