http://acm.hdu.edu.cn/showproblem.php?pid=2157
思路:这题是快速幂的经典例题之一,可以把k当做指数,然后进行矩阵快速幂就可以了。
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;
const int N=1000;
int m,n;
int a[25][25],b[25][25],c[25][25];
void fix(int q[25][25],int p[25][25])
{
int i,j;
int z[25][25];
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
z[i][j]=0;
for(int k=0;k<m;k++)
z[i][j]=(z[i][j]+q[i][k]*p[k][j])%N;
}
}
for(i=0;i<m;i++)
for(j=0;j<m;j++)
q[i][j]=z[i][j];
}
int fina(int x,int y,int k)
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
if(i==j)b[i][j]=1;
else b[i][j]=0;
}
}
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
c[i][j]=a[i][j];
}
}
while(k)
{
if(k&1)fix(b,c);
fix(c,c);
k>>=1;
}
return b[x][y];
}
int main()
{
while(cin>>m>>n&&m+n)
{
memset(a,0,sizeof(a));
int i;
for(i=0;i<n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
a[x][y]=1;
}
int T;
cin>>T;
while(T--)
{
int A,B,k;
scanf("%d %d %d",&A,&B,&k);
int e=fina(A,B,k);
cout<<e<<endl;
}
}
return 0;
}