再次分析题目,会发现递推公式
进而推出
问题转化为求
这里要用到 矩阵二分乘法。
矩阵二分乘法是一种有效的快速计算矩阵幂的算法。
矩阵二分乘法通常可以将线性递推问题O(n)时间缩短到O(log(n))。
#include <iostream>
#include <string>
#include <ctype.h>
#include <algorithm>
using namespace std;
void matrixmul(int p[2][2],int q[2][2])
{
int t[2][2];
t[0][0]=p[0][0]*q[0][0]+p[0][1]*q[1][0];
t[0][1]=p[0][0]*q[0][1]+p[0][1]*q[1][1];
t[1][0]=p[1][0]*q[0][0]+p[1][1]*q[1][0];
t[1][1]=p[1][0]*q[0][1]+p[1][1]*q[1][1];
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
p[i][j]=t[i][j]%10000;
}
void matrixcal(int p[2][2],int n)
{
int t[2][2];
if(n==1)
return;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
t[i][j]=p[i][j];
if(n&1)
{
matrixcal(p,n-1);
matrixmul(p,t);
}
else
{
matrixcal(p,n/2);
matrixmul(p,p);
}
}
int main()
{
long long a0,a1,p,q,k;
while(cin>>a0>>a1>>p>>q>>k)
{
if(k==0)
{
cout<<a0<<endl;
continue;
}
if(k==1)
{
cout<<a1<<endl;
continue;
}
int matrix[2][2];
matrix[0][0]=p%10000;
matrix[0][1]=q%10000;
matrix[1][0]=1;
matrix[1][1]=0;
matrixcal(matrix,k-1);
cout<<(matrix[0][0]*a1+matrix[0][1]*a0)%10000<<endl;
}
return 0;
}