HRBUST 1430 神秘植物 (矩阵快速幂)

来源:互联网 发布:淘宝的品质退款包括 编辑:程序博客网 时间:2024/05/17 04:41

思路转载:http://blog.csdn.net/mengxiang000000/article/details/50962375

题目:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1430

代码:

#include<stdio.h>#include<string.h>#define MOD 1000000007using namespace std;struct point{    long long int m[2][2];}ans,base;point mliti(point a,point b){    point temp;    for(int i=0;i<2;i++)    {        for(int j=0;j<2;j++)        {            temp.m[i][j]=0;            for(int k=0;k<2;k++)            {                temp.m[i][j]=(temp.m[i][j]+a.m[i][k]*b.m[k][j])%MOD;            }        }    }    return temp;}long long int fast(long long int n){    base.m[0][0]=base.m[1][1]=3;    base.m[0][1]=base.m[1][0]=1;    ans.m[0][0]=ans.m[1][1]=1;    ans.m[0][1]=ans.m[1][0]=0;    while(n)    {        if(n%2==1)            ans=mliti(ans,base);        base=mliti(base,base);        n=n/2;    }    return ans.m[0][0];}int main(){    long long int t;    while(~scanf("%lld",&t))    {        printf("%lld\n",fast(t));    }}

算是一种类型题吧。

先找规律,

我们用Fn表示蓝色(向上)的三角形,用Sn来表示白色(向下)的三角形,

N          0                 1                2                  3                       4                                                      Fn13103636*3+28    Sn0162828*3+36

即:Fn=Fn-1*3+Sn-1

Sn=Sn-1*3+Fn-1。


Fn=Fn-1*3+Sn-1                    

3 1     Fn-1   0      Fn                                

       *                =

? ?     Sn-1  1       ?


Sn=Sn-1*3+Fn-1

3 1     Fn-1   0      Fn                                

       *                =

1 3     Sn-1  1       Sn


3 1 ^n = Fn ?

1 3         Sn ?

0 0
原创粉丝点击