How many ways?? HDU - 2157 -可达性矩阵-快速幂

  • How many ways??

  •  HDU - 2157 
  • 离散定理:0-1邻接矩阵的k次方,  u-v位置的数字就是 ,u通过k步到达v的方案数。
  • #include<bits/stdc++.h>
    using namespace std;
    #define maxn 23
    #define mod 1000
    int n,m,t,a,b,k;
    struct node
    {
        int x[maxn][maxn];
    } mmp,ok,ans;
    node mup(node c,node d)
    {
        node ret;
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
            {
                ret.x[i][j]=0;
                for(int q=0; q<n; q++)
                    ret.x[i][j]=(ret.x[i][j]+c.x[i][q]*d.x[q][j])%mod;
            }
        return ret;
    }
    void qpow()
    {
        memset(ans.x,0,sizeof(ans.x));
        for(int i=0; i<n; i++)
            ans.x[i][i]=1;
        while(k)
        {
            if(k%2)
                ans=mup(ans,ok);
            ok=mup(ok,ok);
            k/=2;
        }
    }
    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
            if(n==0&&m==0)break;
            memset(mmp.x,0,sizeof(mmp.x));
            while(m--)
            {
                scanf("%d%d",&a,&b);
                mmp.x[a][b]=1;
            }
            scanf("%d",&t);
            while(t--)
            {
                memcpy(ok.x,mmp.x,sizeof(mmp.x));
                scanf("%d%d%d",&a,&b,&k);
                qpow();
                printf("%d\n",ans.x[a][b]);
            }
        }
        return 0;
    }

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值