UVA 10655
題目連接:uva 10655 - Contemplation! Algebra
#include <iostream>
using namespace std;
typedef long long ll;
struct Matrix{
ll e[2][2];
};
Matrix Multiply(Matrix a, Matrix b)
{
Matrix ans;
for(int i=0; i<2; i++)
for(int j=0; j<2; j++)
{
ans.e[i][j]=0;
for(int k=0; k<2; k++)
{
ans.e[i][j]+=(a.e[i][k]*b.e[k][j]);
ans.e[i][j];
}
}
return ans;
}
Matrix quickpow(Matrix a, ll n)
{
Matrix result;
for(int i=0; i<2; i++)
for(int j=0; j<2; j++)
if(i==j) result.e[i][j]=1;
else result.e[i][j]=0;
while(n)
{
if(n&1)
result = Multiply(result, a);
n=n>>1;
a=Multiply(a, a);
}
return result;
}
int main()
{
ll p,q,n;
while(cin>>p>>q>>n&&p+q+n){
if(n==0)cout<<"2\n";
else if(1==n)cout<<p<<endl;
else if(2==n)cout<<ll(p*p-2*q)<<endl;
else {
Matrix A;
A.e[0][0]=p;A.e[0][1]=-1*q;
A.e[1][0]=1;A.e[1][1]=0;
A=quickpow(A,n-2);
ll ans=(p*p-2*q)*A.e[0][0]+p*A.e[0][1];
cout<<ans<<endl;
}
}
return 0;
}