zoukankan      html  css  js  c++  java
  • hdu 3483 A Very Simple Problem

    两种构造的方式都是正确的;

    1.

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 60
    #define ll long long
    using namespace std;
    int x;
    ll M,n;
    struct matrix
    {
        int len_x;
        int len_y;
        ll data[maxn][maxn];
        void ini()
        {
            len_x=0;
            len_y=0;
            memset(data,0,sizeof data);
        }
    };
    
    matrix mat_big;
    ll f[maxn][maxn];
    matrix s;
    
    matrix mat_mul(matrix mat,matrix t)
    {
        matrix ans;
        ans.ini();
        ans.len_x=mat.len_x;
        ans.len_y=t.len_y;
        for(int i=0; i<mat.len_x; i++)
        {
            for(int j=0; j<t.len_y; j++)
            {
                for(int k=0; k<mat.len_y; k++)
                {
                    ans.data[i][j]+=(mat.data[i][k]*t.data[k][j])%M;
                    ans.data[i][j]%=M;
                }
            }
        }
        return ans;
    }
    
    int main()
    {
        f[0][0]=1;
        for(int i=1; i<maxn; i++)
            for(int j=0; j<=i; j++)
            {
                f[i][j]=f[i-1][j]+f[i-1][j-1];
            }
        while(scanf("%lld%d%lld",&n,&x,&M)&&n!=-1)
        {
            mat_big.ini();
            mat_big.len_x=x+2;
            mat_big.len_y=x+2;
            for(int i=0; i<=x; i++)
                for(int j=0; j<=i; j++)
                {
                    mat_big.data[i][j]=x*f[i][j];
                    if(mat_big.data[i][j]>M)mat_big.data[i][j]%=M;
                }
    //        for(int i=0; i<=x; i++)
    //            mat_big.data[x+1][i]=mat_big.data[x][i];
            mat_big.data[x+1][x+1]=1;
            mat_big.data[x+1][x]=1;
            s.ini();
            s.len_y=1;
            s.len_x=x+2;
            s.data[0][0]=1;
            s.data[x+1][0]=0;
    //        for(int i=0;i<=x+1;i++)
    //            s.data[i][0]=1;
            matrix ret;
            ret.ini();
            ret.len_x=x+2;
            ret.len_y=x+2;
            for(int i=0; i<ret.len_x; i++)
                ret.data[i][i]=1;
            n++;
            while(n)
            {
                if(n&1)ret=mat_mul(ret,mat_big);
                n>>=1;
                mat_big=mat_mul(mat_big,mat_big);
            }
            matrix ans=mat_mul(ret,s);
            printf("%lld
    ",ans.data[x+1][0]);
        }
        return 0;
    }
    View Code

    2.

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 60
    #define ll long long
    using namespace std;
    int x;
    ll M,n;
    struct matrix
    {
        int len_x;
        int len_y;
        ll data[maxn][maxn];
        void ini()
        {
            len_x=0;
            len_y=0;
            memset(data,0,sizeof data);
        }
    };
     
    matrix mat_big;
    ll f[maxn][maxn];
    matrix s;
     
    matrix mat_mul(matrix mat,matrix t)
    {
        matrix ans;
        ans.ini();
        ans.len_x=mat.len_x;
        ans.len_y=t.len_y;
        for(int i=0; i<mat.len_x; i++)
        {
            for(int j=0; j<t.len_y; j++)
            {
                for(int k=0; k<mat.len_y; k++)
                {
                    ans.data[i][j]+=(mat.data[i][k]*t.data[k][j])%M;
                    ans.data[i][j]%=M;
                }
            }
        }
        return ans;
    }
     
    int main()
    {
        f[0][0]=1;
        for(int i=1; i<maxn; i++)
            for(int j=0; j<=i; j++)
            {
                f[i][j]=f[i-1][j]+f[i-1][j-1];
            }
        while(scanf("%lld%d%lld",&n,&x,&M)&&n!=-1)
        {
            mat_big.ini();
            mat_big.len_x=x+2;
            mat_big.len_y=x+2;
            for(int i=0; i<=x; i++)
                for(int j=0; j<=i; j++)
                {
                    mat_big.data[i][j]=x*f[i][j];
                    if(mat_big.data[i][j]>M)mat_big.data[i][j]%=M;
                }
            for(int i=0; i<=x; i++)
                mat_big.data[x+1][i]=mat_big.data[x][i];
            mat_big.data[x+1][x+1]=1;
    //        mat_big.data[x+1][x]=1;
            s.ini();
            s.len_y=1;
            s.len_x=x+2;
            s.data[0][0]=1;
            s.data[x+1][0]=0;
    //        for(int i=0;i<=x+1;i++)
    //            s.data[i][0]=1;
            matrix ret;
            ret.ini();
            ret.len_x=x+2;
            ret.len_y=x+2;
            for(int i=0; i<ret.len_x; i++)
                ret.data[i][i]=1;
            while(n)
            {
                if(n&1)ret=mat_mul(ret,mat_big);
                n>>=1;
                mat_big=mat_mul(mat_big,mat_big);
            }
            matrix ans=mat_mul(ret,s);
            printf("%lld
    ",ans.data[x+1][0]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    概率与数学期望
    UVa10870
    UVa10870
    特殊符号+运算优先级
    特殊符号+运算优先级
    poj 2065 SETI(gauss--->≡)
    poj 2065 SETI(gauss--->≡)
    线性筛法证明
    HDU 1728 逃离迷宫
    T^T ONLINE JUDGE 2401 尼克的任务
  • 原文地址:https://www.cnblogs.com/yours1103/p/3592919.html
Copyright © 2011-2022 走看看