[HDU2157] How many ways??

题目

原题地址

解说

裸矩阵快速幂,没啥可说的。
下面再附上\(gyz\)大佬的超级快的\(DP\)做法。

代码

矩阵快速幂:

#include
using namespace std;
const int mod = 1000;
struct ju{
    int ar[25][25];
    ju(){memset(ar,0,sizeof(ar));}
};
int n,m;
ju cheng(ju a,ju b){
    ju ans;
    for(int k=0;k0){
        if(b&1)ret=cheng(ret,a);
        a=cheng(a,a);
        b>>=1;
    }
    return ret;
}
int main(){
    while(1){
    	scanf("%d%d",&n,&m);
    	if(m==0&&n==0) return 0;
        ju a,b;
        memset(a.ar,0,sizeof(a.ar));
        while(m--){
            int u,v;scanf("%d%d",&u,&v);
            a.ar[u][v]=1;
        }
        int t,x,y,k;
        scanf("%d",&t);
        while(t--){
            scanf("%d%d%d",&x,&y,&k);
            b=power(a,k);
            printf("%d\n",b.ar[x][y]);
        }
    }
}

DP:

#include
#include
#include
const int N=11+10;
int dis[N][N],to[N][N];
int main(){
	int n,m;
	while(~scanf("%d%d",&n,&m)){
		if(n==0&&m==0)return 0;
		memset(to,0,sizeof(to));
		for(int i=1;i<=m;i++){
			int a,b;
			scanf("%d%d",&a,&b);
			to[a][b]=1;
		}
		int T;
		scanf("%d",&T);
		while(T--){
			int a,b,k;
			memset(dis,0,sizeof(dis));
			scanf("%d%d%d",&a,&b,&k);
			dis[0][a]=1;
			for(int x=1;x<=k;x++){
				for(int i=0;i

幸甚至哉,歌以咏志。

你可能感兴趣的:([HDU2157] How many ways??)