hdu 5411 多校——矩阵快速幂模板

来源:互联网 发布:数据工具培训心得 编辑:程序博客网 时间:2024/06/04 19:20
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 52;long long ans=0;struct Mat {    int mat[N][N];};int num[N];int n, m;Mat a;void init() {    int i,j;    int x,k;    memset(a.mat,0,sizeof(a.mat));    for(i = 1; i <= n; ++i) {        cin>>x;        for (j=1;j<=x;j++)        {            cin>>k;            a.mat[i][k]=1;        }    }    for (i=1;i<=n+1;i++)        a.mat[i][n+1]=1;}Mat operator * (Mat a, Mat b) {    Mat c;    memset(c.mat,0,sizeof(c.mat));    int i, j, k;    for(k = 1; k <=n; ++k) {        for(i = 1; i <=n; ++i) {  //***            for(j = 1; j <=n; ++j) {   //***                c.mat[i][j] = (c.mat[i][j]+a.mat[i][k] * b.mat[k][j])%2015;            }        }    }    return c;}Mat operator ^ (Mat a, int k) {    Mat c;    int i, j;    for(i = 1; i <=n; ++i)        for(j = 1; j <=n; ++j)            c.mat[i][j] = (i == j);        for(; k; k >>= 1) {        if(k&1) c = c*a;                a = a*a;    }    return c;}int main(){    int T;    cin>>T;    while(T--)    {        cin>>n>>m;        init();        n++;        int k,i,j;        Mat c;            c=a^(m-1);        long long ans=0;            for (i=1;i<=n;i++)                for (j=1;j<=n;j++)                {                    ans=(ans+c.mat[i][j])%2015;                                                        }        cout<<ans<<endl;    }    return 0;}

0 0
原创粉丝点击