矩阵快速幂模板和构造矩阵

板子代码(其余的题构造出矩阵代入,改下计算的结果就行)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define mod 10000
struct node
{
    long long m[2][2];//根据构造的矩阵而定数组的大小
} a;
node c=//构造的矩阵
{
    1,1,
    1,0
};
node juzhen(node k,node b)//矩阵快速幂
{
    node h;
    memset(h.m,0,sizeof(h.m));
    for(int i=0; i<2; i++)
    {
        for(int j=0; j<2; j++)
        {
            for(int z=0; z<2; z++)
                h.m[i][j]+=(k.m[i][z]%mod)*(b.m[z][j]%mod)%mod;
        }
    }
    return h;
}
//如果题目卡时间的话,可以用下面的代码,
//node juzhen(node k,node b)
//{
//    node h;
//    memset(h.m,0,sizeof(h.m));
//    for(int i=0; i<2; i++)
//    {
//        for(int j=0; j<2; j++)
//        {
//            if(k.m[i][j])//剪枝
//            {
//                for(int z=0; z<2; z++)
//                    h.m[i][z]+=(k.m[i][j]%mod)*(b.m[j][z]%mod)%mod;
//            }
//        }
//    }
//    return h;
//}
node mul(node b,long long n)
{
    node ans=b,k=c;
    while(n)
    {
        if(n%2==1)
        {
            ans=juzhen(ans,k);
        }
        n/=2;
        k=juzhen(k,k);
    }
    return ans;
}
int main()
{
    long long n;
    while(~scanf("%lld",&n)&&n!=-1)
    {
        if(n==0)
            printf("0\n");
        else if(n==1)
            printf("1\n");
        else
        {
            node a;
            memset(a.m,0,sizeof(a.m));
            for(int i=0; i<2; i++)
                a.m[i][i]=1;
            node d=mul(a,n-1);
            printf("%lld\n",d.m[0][0]%mod);
        }
    }
    return 0;
}

1.矩阵一般要连续的,比如n,n-1,n-2,,,,,诸如此类,说一个典型的构造f(n)=f(n-1)+f(n-3);

构造这个函数时,不能简单的构造个2*1的【f(n-1) f(n-3)】矩阵,应该构造3*1的【f(n-1) f(n-2) f(n-3)】的矩阵,如图

1     0       1                 f(n-1)                    f(n)

1     0       0         *       f(n-2)           =      f(n-1)

0     1       0                 f(n-3)                   f(n-3)

2.构造矩阵时有时候有必要加入常数,构造f(n)=f(n-1)+f(n-2)+p;

构造这个矩阵可以构造3*1的【f(n-1) f(n-2) p】矩阵,如图

1        1          1                  f(n-1)                  f(n)

1        0          0           *      f(n-2)        =        f(n-1)

0       0          1                    p                         p

3.构造矩阵的时候必要时进行拆分,比如F(n) = 2*F(n-2) + F(n-1) + n^4,把n^4进行拆分。(面这个是偷来的,有点懒啊啊啊啊,无视这里)

 4.有时候构造的矩阵里面不只有这一种变量f(n),还可能有多种变量,例如下面这道题https://vjudge.net/contest/242514#problem/F

这道题假设第n个图中朝上的三角形个数为f(n),第n个图中朝下的三角形个数为g(n)。构造矩阵如图

3      1                 f(n-1)                f(n)

1      3          *      g(n-1)       =      g(n),

求f(n)即可

就这样吧,我再碰到好的构造再补充,,,

猜你喜欢

转载自blog.csdn.net/qq_41129854/article/details/81539651