读书人

How many ways? hdu 2157

发布时间: 2013-03-01 18:33:02 作者: rapoo

How many ways?? hdu 2157

#include <iostream>#include <stdio.h>#include <cstring>using namespace std;int tmp[21][21],ans[21][21],b[21][21];int N;void mul(int a[][21],int b[][21]){    memset(tmp,0,sizeof(tmp));    for(int i=1; i<=N; i++)        for(int j=1; j<=N; j++)            for(int k=1; k<=N; k++)            {                tmp[i][j]+=a[i][k]*b[k][j];                if(tmp[i][j]>=1000) tmp[i][j]%=1000;            }    memcpy(a,tmp,sizeof(tmp));}void pow(int a[][21],int b[][21],int k){    memset(a,0,sizeof(a));    for(int i=1; i<=N; i++)        a[i][i]=1;    while(k)    {        if(k&1) mul(a,b);        mul(b,b);        k>>=1;    }}int main(){    int m,k,T,s,t;    int temp[21][21];    while(scanf("%d%d",&N,&m)==2)    {        if(N==0&&m==0) break;        memset(b,0,sizeof(b));        memset(temp,0,sizeof(temp));        while(m--)        {            scanf("%d%d",&s,&t);            b[++s][++t]=1;            temp[s][t]=1;        }        scanf("%d",&T);        while(T--)        {            memset(ans,0,sizeof(ans));            scanf("%d%d%d",&s,&t,&k);            memcpy(b,temp,sizeof(temp));            pow(ans,b,k);            printf("%d\n",ans[++s][++t]%1000);        }    }    return 0;}

读书人网 >编程

热点推荐