一道板子得不能再板子的题
还把数据范围出成了暴力dp都能过的
矩阵快速幂,新建0号点表示爆炸,每个点连一个自环表示停留,没了
Code:
#include<bits/stdc++.h>
#define mod 2017
using namespace std;
inline int read(){
int res=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();}
while(isdigit(ch)) {res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}
return res*f;
}
const int N=35;
inline int mul(int x,int y){return 1ll*x*y%mod;}
inline void inc(int &x,int y){x+=y;if(x>=mod) x-=mod;}
inline int add(int x,int y){x+=y;if(x>=mod) x-=mod;return x;}
struct Mat{
int a[N][N];
inline Mat operator * (const Mat &b)const{
Mat res;
memset(res.a,0,sizeof(res.a));
for(int i=0;i<=30;i++)
for(int j=0;j<=30;j++)
for(int k=0;k<=30;k++)
inc(res.a[i][j],mul(a[i][k],b.a[k][j]));
return res;
}
friend inline Mat operator ^ (Mat x,int b){
Mat res;
memset(res.a,0,sizeof(res.a));
for(int i=0;i<=30;i++) res.a[i][i]=1;
for(;b;b>>=1,x=x*x) if(b&1) res=res*x;
return res;
}
}e;
int main(){
int n=read(),m=read();
memset(e.a,0,sizeof(e.a));
for(int i=1;i<=m;i++){
int x=read(),y=read();
e.a[x][y]=e.a[y][x]=1;
}
for(int i=1;i<=n;i++){
e.a[i][0]=1;e.a[i][i]=1;
}
e.a[0][0]=1;
int t=read();
e=e^t;
int res=0;
for(int i=0;i<=n;i++) inc(res,e.a[1][i]);
cout<<res;
return 0;
}