标签:
直接构造矩阵,最上面一行加一排1.快速幂计算矩阵的m次方,统计第一行的和
1 3 2 1 2 1 3 0
6Hintpossible patterns are ?, 1, 2, 3, 1→2, 2→3
/* *********************************************** Author :CKboss Created Time :2015年08月20日 星期四 23时25分19秒 File Name :HDOJ5411.cpp ************************************************ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> using namespace std; const int mod=2015; int n,m; struct Matrix { int m[60][60]; Matrix() { memset(m,0,sizeof(m)); } void getE() { for(int i=0;i<n;i++) m[i][i]=1; } void toString() { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { printf("%d,",m[i][j]); } putchar(10); } } }; Matrix Mulit(Matrix a,Matrix b) { Matrix M; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { int temp=0; for(int k=0;k<n;k++) { temp=(temp+a.m[i][k]*b.m[k][j])%mod; } M.m[i][j]=temp; } } return M; } Matrix QuickPow(Matrix a,int x) { Matrix e; e.getE(); while(x) { if(x&1) e=Mulit(e,a); a=Mulit(a,a); x/=2; } return e; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T_T; scanf("%d",&T_T); while(T_T--) { scanf("%d%d",&n,&m); Matrix M; for(int i=1;i<=n;i++) { int k,x; scanf("%d",&k); for(int j=0;j<k;j++) { scanf("%d",&x); M.m[i][x]=1; } } n++; for(int i=0;i<n;i++) M.m[0][i]=1; Matrix mt=QuickPow(M,m); int ans=0; for(int i=0;i<n;i++) { ans=(ans+mt.m[0][i])%mod; } printf("%d\n",ans); } return 0; }
版权声明:来自: 码代码的猿猿的AC之路 http://blog.csdn.net/ck_boss
HDOJ 5411 CRB and Puzzle 矩阵快速幂
标签:
原文地址:http://blog.csdn.net/ck_boss/article/details/47819389