1875: [SDOI2009]HH去散步 矩阵乘法
2016-03-11 07:13
363 查看
由于不能走来时的边,可以把边转化成点,其余就是裸的矩阵乘法了。
[code]#include<iostream> #include<cstdio> #include<cstring> #define M 125 #define P 45989 using namespace std; int n,m,t,a,b,cnt,sum; int head[25]; int list[M],next[M],from[M]; inline int read() { int a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } struct Matrix { int a[M][M]; Matrix() { memset(a,0,sizeof(a)); } friend Matrix operator*(Matrix a,Matrix b) { Matrix ans; for (int i=0;i<=cnt;i++) for (int j=0;j<=cnt;j++) for (int k=0;k<=cnt;k++) (ans.a[i][j]+=a.a[i][k]*b.a[k][j]%P)%=P; return ans; } friend Matrix operator^(Matrix a,int b) { Matrix ans; for (int i=0;i<=cnt;i++) ans.a[i][i]=1; for (;b;b>>=1,a=a*a) if (b&1) ans=ans*a; return ans; } }; Matrix A,ans; inline void insert(int x,int y) { next[++cnt]=head[x]; head[x]=cnt; from[cnt]=x; list[cnt]=y; } int main() { n=read(); m=read(); t=read(); a=read()+1; b=read()+1; for (int i=1;i<=m;i++) { int u=read()+1,v=read()+1; insert(u,v); insert(v,u); } for (int i=head[a];i;i=next[i]) ans.a[0][i]++; for (int i=1;i<=cnt;i++) for (int j=head[list[i]];j;j=next[j]) if (j!=i+((i&1)?1:-1)) A.a[i][j]++; A=A^(t-1); ans=ans*A; for (int i=1;i<=cnt;i++) if (list[i]==b) (sum+=ans.a[0][i])%=P; cout << sum << endl; return 0; }
相关文章推荐
- golang go语言与C语言互调,通过cgo
- 业界个人观系列 开源在成都
- lintcode-easy-Valid Sudoku
- Go 语言运行时环境变量快速导览
- 删除菜单
- 技术流水账 图床
- CPU 和内存虚拟化原理 - 每天5分钟玩转 OpenStack(6)
- CPU 和内存虚拟化原理 - 每天5分钟玩转 OpenStack(6)
- MongoDB驱动之Linq操作
- Leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal
- Selenium2(WebDriver)_如何判断WebElement元素对象是否存在
- Leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal
- vaadin 7 使用gwt 发布js和css
- Webstrom中配置compass监听自动编译
- 71. Simplify Path
- [C++] 回溯法生成数独
- Vaadin 7 和 extjs mvc 集成示例
- android开发练习:天气应用
- 移动端H5页面高清多屏适配方案
- retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS)