[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;
}