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;
}
本文提供了一道UVA10655竞赛题目的解决方案,通过矩阵快速幂的方法来高效求解特定代数序列的第n项。文章详细展示了如何使用C++实现矩阵乘法及快速幂运算。
296

被折叠的 条评论
为什么被折叠?



