hdu 2157 How many ways??
来源:互联网 发布:流程图软件推荐 编辑:程序博客网 时间:2024/05/16 06:52
这是一道经典的矩阵快速幂的题(可参考acm题集方向中的矩阵快速幂第8条),只需套一下模板,对应求一下数据就可以了,矩阵快速幂有点像disjkstra或者FLOYD 懂模板会用解题很方便(不太像万恶的背包或者说dp hh)
AC:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> using namespace std; const int MAX=20+10; const int mod=1000; int f[MAX][MAX],sum[MAX][MAX],array[MAX][MAX]; int n,m; void MatrixMult(int a[MAX][MAX],int b[MAX][MAX]){//矩阵相乘 int c[MAX][MAX]={0}; for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ for(int k=0;k<n;++k){ c[i][j]=(c[i][j]+a[i][k]*b[k][j])%mod; } } } for(int i=0;i<n;++i){ for(int j=0;j<n;++j)a[i][j]=c[i][j]; } } int Matrix(int a,int b,int k){//矩阵快速幂 for(int i=0;i<n;++i){//初始化矩阵sum,使sum*b=b(b是矩阵) for(int j=0;j<n;++j){ if(i == j)sum[i][j]=1; else sum[i][j]=0; } } for(int i=0;i<n;++i){//将最初矩阵f复制给array for(int j=0;j<n;++j)array[i][j]=f[i][j]; } while(k){ if(k&1)MatrixMult(sum,array); MatrixMult(array,array); k>>=1; } return sum[a][b]; }int main(){int s,t,T,a,b,k;while(scanf("%d %d",&n,&m)==2&&(n||m)){memset(f,0,sizeof(f));for(int i=0;i<m;i++){scanf("%d %d",&s,&t);f[s][t]=1;}scanf("%d",&T);while(T--){scanf("%d %d %d",&a,&b,&k);cout<<Matrix(a,b,k)%1000<<endl;}}return 0;}其中非main函数部分是模板可以收集一下嘿嘿
0 0
- hdu 2157 How many ways??
- How many ways?? hdu 2157
- HDU 2157 How many ways??
- hdu 2157:How many ways??
- hdu 2157 How many ways??
- HDU 2157 How many ways??
- HDU 2157 How many ways??
- HDU-2157 How many ways?
- hdu 2157 How many ways??
- hdu 2157 How many ways??
- hdu 2157 How many ways??
- HDU 2157 How many ways
- hdu how many ways
- HDU How many ways
- How many ways??(hdu 2157)
- HDU 2157 How many ways?? (DP)
- hdu 1948 How many ways
- hdu 1978 How many ways
- hdu1106 排序(堆排序)
- cpp——与c之不同——enum
- 2.Matlab画好图后,如何插入到word里面去
- 获取数组中的最大值、最小值以及数组排序
- ccf 目录格式转换
- hdu 2157 How many ways??
- JS:js中的排序算法
- Maven 入门、常用命令、扩展及配置
- Java 方法参数的变化
- hdu1381 hash
- Apache Httpclient4.5学习笔记
- UNITY新手小游戏
- leetCode练习(134)(
- 计算FLT_MAX的整数位长度