HDU 2157 How many ways??

矩阵快速幂。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn=25;
const int MOD=1000;
int x,y,s,t,m,n,k;
struct node
{
    int matrix[maxn][maxn];
    
    node operator*(node b);
} a,b,c;

node node::operator*(node b)
{
    node c;
    memset(c.matrix,0,sizeof(c.matrix));

    int i,j,k;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            for(k=1; k<=n; k++)
            {
                c.matrix[i][j]=(c.matrix[i][j]+(matrix[i][k]*b.matrix[k][j])%MOD)%MOD;
            }
        }
    }
    return c;
}

int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        if(m==0&&n==0) break;

        memset(a.matrix,0,sizeof(a.matrix));
        memset(b.matrix,0,sizeof(b.matrix));
        while(m--)
        {
            scanf("%d%d",&s,&t);
            s++; t++;
            b.matrix[s][t]=1;
        }

        int T;
        scanf("%d",&T);

        while(T--)
        {
            scanf("%d%d%d",&x,&y,&k);
            x++; y++;
            for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=n; j++)
                {
                    a.matrix[i][j]=b.matrix[i][j];

                    if(i==j) c.matrix[i][j]=1;
                    else c.matrix[i][j]=0;
                }
            }

            while(k)
            {
                if(k%2) c=c*a,k--;
                else a=a*a,k/=2;
            }
            
            printf("%d\n",c.matrix[x][y]);
        }
    }
    return 0;
}

 

posted @ 2015-08-11 14:11  雲碧  阅读(129)  评论(0)    收藏  举报