链接
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1596
题解
令
f
n
=
a
n
+
b
n
f_n=a^n+b^n
fn=an+bn
则
f
n
+
2
=
−
q
f
n
+
p
f
n
+
1
f_{n+2}=-qf_{n}+pf_{n+1}
fn+2=−qfn+pfn+1
矩阵快速幂
代码
#include <bits/stdc++.h>
#define cl(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long ll;
struct matrix
{
ll a[5][5], n, m;
matrix(ll n, ll m):n(n),m(m){cl(a);}
ll* operator[](int index)
{
return a[index];
}
matrix operator*(matrix b)
{
ll i, j, k;
matrix c(n,b.m);
for(i=1;i<=c.n;i++)for(k=1;k<=m;k++)for(j=1;j<=c.m;j++)c[i][j]+=a[i][k]*b[k][j];
return c;
}
matrix fastpow(ll b)
{
matrix ans(n,n), t(*this);
ll i;
for(i=1;i<=n;i++)ans[i][i]=1;
for(;b;b>>=1,t=t*t)if(b&1)ans=ans*t;
return ans;
}
};
int main()
{
ll i, p, q, n;
while(scanf("%lld %lld %lld",&p,&q,&n)==3)
{
matrix f(1,2), trans(2,2);
f[1][1]=2, f[1][2]=p;
trans[1][1]=0, trans[1][2]=-q;
trans[2][1]=1, trans[2][2]=p;
f=f*trans.fastpow(n);
printf("%lld\n",f[1][1]);
}
return 0;
}