Contemplation! Algebra UVA - 10655

Contemplation! Algebra UVA - 10655
题意:给a+b,ab,求a^n+b^n。
思路:a^n+b^n=(a^(n-1)+b^(n-1))*(a+b)-ab(a^(n-2)+b^(n-2)).
即f(n)=(a+b)f(n-1)-abf(n-2).
坑点:输入时只输入a b==0 0的时候结束。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
struct  matrix{
    ll x[2][2];
};
matrix multi(matrix a,matrix b){
    matrix temp;
    memset(temp.x,0,sizeof(temp.x));
    for(int i=0;i<2;i++)
        for(int j=0;j<2;j++)
            for(int k=0;k<2;k++)
            {
                temp.x[i][j]+=a.x[i][k]*b.x[k][j];
            }
    return temp;
}
matrix quick_multi(matrix a,ll n)//矩阵快速幂
{
    matrix temp=a;
    n--;
    while(n){
        if(n&1)
            temp=multi(temp,a);
        a=multi(a,a);
        n>>=1;
    }
    return temp;
}
int main()
{
    ll x,y,n;//f(i)=(a+b)f(i-1)-abf(i-2)
    while(scanf("%lld%lld%lld",&x,&y,&n)==3)
    {
        //scanf("%lld",&n);
        matrix a,b;
        memset(a.x,0,sizeof(a.x));
        memset(b.x,0,sizeof(b.x));
        a.x[0][0]=x;a.x[1][0]=-y;a.x[0][1]=1;
        b.x[0][0]=x;b.x[0][1]=2;
        if(n>=2)
        {
            a=quick_multi(a,n-1);
            b=multi(b,a);
            printf("%lld\n",b.x[0][0]);
        }
        else
        {
            n==1?printf("%lld\n",x):printf("%lld\n",2);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Miranda_ymz/article/details/81603595