[BZOJ4887][矩阵快速幂]TJOI2017:可乐

BZOJ4887

一道板子得不能再板子的题
还把数据范围出成了暴力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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值