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;
}