标签:following mos href lines chm art repr hdu article
直接构造矩阵,最上面一行加一排1.高速幂计算矩阵的m次方,统计第一行的和
(Two patterns
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;
}
HDOJ 5411 CRB and Puzzle 矩阵高速幂
标签:following mos href lines chm art repr hdu article
原文地址:http://www.cnblogs.com/mfmdaoyou/p/6918565.html