• hdu 2563 统计问题


    题目:统计问题

    思路:将问题转换成,前一状态是左或者右的,或者前的,设左右的那种是A(n-1),前的那种是B(n-1),那么对于当前的状态,如果现在往前B(n)=2*A(n-1)+B(n-1),如果往左:A(n)=A(n-1)+B(n-1) 往右的相同,那么对于这样的一个问题,可以构造矩阵或者求递推式,练下矩阵,所以写成构造矩阵的了

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <iostream>
    using namespace std;
    struct Matrix
    {
        int m[3][3];
    }E,D;
    void init()
    {
        for(int i=1;i<=2;i++)
            for(int j=1;j<=2;j++)
            {
                E.m[i][j]=(i==j);
                D.m[i][j]=1;
            }
        D.m[2][1]=2;
    }
    Matrix Multi(Matrix A,Matrix B)
    {
        Matrix ans;
        for(int i=1;i<=2;i++)
            for(int j=1;j<=2;j++)
            {
                ans.m[i][j]=0;
                for(int k=1;k<=2;k++)
                    ans.m[i][j]+=A.m[i][k]*B.m[k][j];
            }
        return ans;
    }
    Matrix Pow(Matrix A,int k)
    {
        Matrix ans=E;
        while(k)
        {
            if(k&1)
            {
                k--;
                ans=Multi(ans,A);
            }
            else
            {
                k/=2;
                A=Multi(A,A);
            }
        }
        return ans;
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        init();
        while(t--)
        {
            int n;
            scanf("%d",&n);
            Matrix ans=Pow(D,n);
            printf("%d
    ",ans.m[1][1]+ans.m[2][1]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    【20221012】连岳摘抄
    【20221006】主次之分
    【20221011】三孩家庭
    【20221007】连岳摘抄
    【20221009】连岳摘抄
    【20221010】连岳摘抄
    【20221005】回趟老家
    NOIP2022 不知道该怎么形容记
    Solution 「NOI Simu.」逆天题
    Solution 「NOI Simu.」记忆
  • 原文地址:https://www.cnblogs.com/overflow/p/3145533.html
Copyright © 2020-2023  润新知