\(Sol\)

设\(f_i\)为到第\(i\)秒的方案数,显然\(f_i=\)在第\(i\)秒前爆炸的方案数+在第\(i\)秒爆炸的方案数+在第\(i\)秒停下的方案数+在第\(i\)秒走向下一个城市

的方案数.注意到第四个转移和当前在哪个城市有关,所以要另记一维\(j\)表示当前位置.于是\(f_{i,j}=\)第\(i\)秒前在\(j\)爆炸的方案数+第\(i\)秒在\(j\)爆炸的方案数+第\(i\)秒停在\(j\)的方案数+第\(i\)秒由别的城市走向\(j\)的方案数.记这四个量分别为\(f1,f2,f3,f4\).

\(f1_{i,j}=f1_{i-1,j}+f2_{i-1,j}\)

\(f2_{i,j}=f3_{i-1,j}+f4_{i-1,j}\)

\(f3_{i,j}=f3_{i-1,j}+f4_{i-1,j}\)

\(f4_{i,j}=f3_{i-1,k}+f4_{i-1,k}\),其中,\(k\)是\(j\)的相邻城市.

这样瞎\(dp\)一下就可以获得\(20pts\)的好成绩\(QAQ\).

其实上面的转移方程看起来就很矩阵优化的亚子,于是矩阵优化一下就好辣.

\(Code\)

#include<bits/stdc++.h>
#define il inline
#define Ri register int
#define go(i,a,b) for(Ri i=a;i<=b;++i)
#define yes(i,a,b) for(Ri i=a;i>=b;--i)
#define e(i,u) for(Ri i=b[u];i;i=a[i].nt)
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define db double
#define inf 2147483647
using namespace std;
il int read()
{
Ri x=0,y=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*y;
}
const int mod=2017;
int n,m,t,as;
vector<int>to[31];
struct mt
{
int a[121][121];bool ste;
il void clear(){mem(a,0);ste=0;}
}trs,cur;
il void inc(Ri &x,Ri y){x+=y;if(x>=mod)x-=mod;}
il mt operator * (mt x,mt y)
{
mt z;z.clear(),z.ste=x.ste;Ri h=x.ste?1:n*4;
go(i,1,h)
go(j,1,n*4)
go(k,1,n*4)
inc(z.a[i][j],1ll*x.a[i][k]*y.a[k][j]%mod);
return z;
}
il void init()
{
trs.clear();
go(i,1,n)
{
Ri mi=(i-1)*4+1;
trs.a[mi][mi]=trs.a[mi+1][mi]=1;
trs.a[mi+2][mi+1]=trs.a[mi+3][mi+1]=1;
trs.a[mi+2][mi+2]=trs.a[mi+3][mi+2]=1;
go(j,0,(int)to[i].size()-1){Ri k=(to[i][j]-1)*4+3;trs.a[k][mi+3]=trs.a[k+1][mi+3]=1;}
}
}
int main()
{
n=read(),m=read();
go(i,1,m){Ri u=read(),v=read();to[u].push_back(v),to[v].push_back(u);}
init();cur.clear();cur.a[1][3]=1,cur.ste=1;
t=read();
while(t){if(t&1)cur=cur*trs;trs=trs*trs;t>>=1;}
go(i,1,n*4)inc(as,cur.a[1][i]);
printf("%d\n",as);
return 0;
}

随机推荐

  1. 模板—Hash_map

    struct Hash_map { ],nx[]; ];]; inline double &operator [] (int x) { ,i=fi[k]; for(;i&&st ...

  2. 第四次C++

    继承与派生 一.什么是继承和派生 所谓继承就是从先辈处得到属性和行为特征.类的继承,是新的类从已有类那里得到已有的特性.从另一个角度来看这个问题,从已有类产生新类的过程就是类的派生.类的继承与派生机制 ...

  3. Nova中的Hook机制

    Nova的代码中支持Hook机制,也就是在某些函数的前后,可以加入自己的代码逻辑.Hook代码可以完全独立于Nova开发,本质上使用setuptools的entry points机制.K版本的Open ...

  4. @codeforces - 590E@ Birthday

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 n 个互不相同的只包含 'a', 'b' 的字符串. 请选 ...

  5. vue init定制团队模板使用方法

    每次做项目都要自己搭建项目目录,或者换了公司就的重新搭建项目目录,是不是很麻烦呢?有没有想过一次性把项目目录搭建好,以后直接用呢?你首先想到的可能是复制自己原来的项目,然后删除.修改等等.然而有个更方 ...

  6. Android教程-02 在程序中输出Log

    视频教程,建议采用超清模式观看 在Android中一般都用Log输出日志,常见的有5个不同的级别 Log.v() Log.d() Log.i() Log.w() Log.e() 当然很多程序员还比较习 ...

  7. HMM(隐马尔科夫)用于中文分词

    隐马尔可夫模型(Hidden Markov Model,HMM)是用来描述一个含有隐含未知参数的马尔可夫过程. 本文阅读了2篇blog,理解其中的意思,附上自己的代码,共同学习. 一.理解隐马尔科夫 ...

  8. SpringBoot2集成Activiti6

    Activiti是领先的轻量级的,以Java为中心的开源BPMN(Business Process Modeling Notation)引擎,实现了真正的流程自动化.下面介绍如何在SpringBoot ...

  9. halcon坐标转换(机器人坐标转换用)

    #图像坐标r:=[431, 355, 507, 53, 507]c:=[505, 543, 316, 127, 883]#物理坐标(例如机器人坐标)r1:=[0, 2.0, -2.0, 10, -2. ...

  10. HOSt ip is not allowed to connect to this MySql server, MYSQL添加远程用户或允许远程访问三种方法

    HOSt ip is not allowed to connect to this MySql server 报错:1130-host ... is not allowed to connect to ...