[bzoj 4887] [Tjoi2017]可乐

传送门

Description

加里敦星球的人们特别喜欢喝可乐。因而,他们的敌对星球研发出了一个可乐机器人,并且

放在了加里敦星球的1号城市上。这个可乐机器人有三种行为:停在原地,去下一个相邻的

城市,自爆。它每一秒都会随机触发一种行为。现在给出加里敦星球城市图,在第0秒时可

乐机器人在1号城市,问经过了t秒,可乐机器人的行为方案数是多少?

Solution

蒟蒻\(PaperCloud\)终于\(bzoj\)百题祭啦

方案数=邻接矩阵^t

自爆?建一个虚节点,所有点连向它即可。

留在原地?自己向自己连边就可以了


Code 

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	return x*f;
}
#define mod 2017
#define reg register
int N,M,u,v,T;
struct matrix
{
	int a[35][35],size;
	matrix(int _n=0,int _o=0):size(_n){memset(a,0,sizeof a);if(_o)for(reg int i=0;i<=size;i++) a[i][i]=1;}
    matrix operator *(const matrix& b)const
	{
        matrix C(size);
        for(int i=0;i<=size;i++)for(int j=0;j<=size;j++)
        for(int k=0;k<=size;k++) C.a[i][j]+=(a[i][k]*b.a[k][j])%mod;
        return C;
    }
};
matrix fpow(matrix x,int m){
    matrix ret(N,1);
    for(;m;x=x*x,m>>=1) if(m&1) ret=ret*x;
    return ret;
}
int main()
{
	N=read();M=read();
	register int i;matrix pac(N,1);
	for(i=1;i<=N;++i) pac.a[i][0]++;
	for(i=1;i<=M;++i) u=read(),v=read(),pac.a[u][v]++,pac.a[v][u]++;
	pac=fpow(pac,read());
	register int ans=0;
	for(i=0;i<=N;++i) (ans+=pac.a[1][i])%=mod;
	return 0*printf("%d\n",ans);
}


Blog来自PaperCloud,未经允许,请勿转载,TKS!

posted @ 2019-01-09 14:45  PaperCloud  阅读(193)  评论(0编辑  收藏  举报