[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!

转载于:https://www.cnblogs.com/PaperCloud/p/10244301.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值