UVA 10655 Contemplation! Algebra (矩阵快速幂)

题目链接:传送门

题意:

给定你三个数,p,q,n, p代表的是 a + b, q代表的是a*b;

然后求a^n + b^n

设f[i] = a^i +b^i; f[0]=2,f[1]=p;

f[i]*(a+b) = a^(i+1) + b^(i+1) +a^i*b + b^i*a;

f[i]*p = f[i+1] + a*b*[ a^(i-1) + b^(i-1) ]

f[i+1] = f[i]*p + q*f[i-1];

然后用矩阵加速一下就可以了(ps.这个题的输入非常坑。。。。)

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#define PB push_back
#define MP make_pair
#define REP(i,n) for(int i=0;i<(n);++i)
#define FOR(i,l,h) for(int i=(l);i<=(h);++i)
#define DWN(i,h,l) for(int i=(h);i>=(l);--i)
#define IFOR(i,h,l,v) for(int i=(h);i<=(l);i+=(v))
#define CLR(vis) memset(vis,0,sizeof(vis))
#define MST(vis,pos) memset(vis,pos,sizeof(vis))
#define MAX3(a,b,c) max(a,max(b,c))
#define MAX4(a,b,c,d) max(max(a,b),max(c,d))
#define MIN3(a,b,c) min(a,min(b,c))
#define MIN4(a,b,c,d) min(min(a,b),min(c,d))
#define PI acos(-1.0)
#define INF 1000000000
#define LINF 1000000000000000000LL
#define eps 1e-8
#define LL long long
using namespace std;

const int maxn = 2;

struct matrix{
    LL a[maxn][maxn];
    matrix operator *(matrix b){
        matrix ans;
        REP(i,maxn){
            REP(j,maxn){
                ans.a[i][j]=0;
                REP(k,maxn) ans.a[i][j]+=a[i][k]*b.a[k][j];
            }
        }
        return ans;
    }
};

matrix I={1,0,0,1};

matrix pow(matrix A,LL k){
    matrix ans = I;
    while(k){
        if(k&1) ans=ans*A;
        k>>=1;
        A=A*A;
    }
    return ans ;
}

int main()
{
    LL p,q,n;
    while(cin>>p>>q>>n){
        if(n==0){puts("2");continue;}
        LL f0=2,f1=p;
        matrix A={p,-q,1,0};
        matrix tmp = I*A;
        matrix ans = pow(A , n-1);
        cout<<ans.a[0][0]*f1+ans.a[0][1]*f0<<endl;
    }
    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值