分解幂计算再加和
递推数列
核心:求方阵的幂
# include <iostream>
using namespace std;
void MatrixMultiply ( int m1[ 2 ] [ 2 ] , int m2[ 2 ] [ 2 ] , int res[ 2 ] [ 2 ] ) {
res[ 0 ] [ 0 ] = ( m1[ 0 ] [ 0 ] * m2[ 0 ] [ 0 ] % 10000 ) + ( m1[ 0 ] [ 1 ] * m2[ 1 ] [ 0 ] % 10000 ) ;
res[ 0 ] [ 0 ] %= 10000 ;
res[ 0 ] [ 1 ] = ( m1[ 0 ] [ 0 ] * m2[ 0 ] [ 1 ] % 10000 ) + ( m1[ 0 ] [ 1 ] * m2[ 1 ] [ 1 ] % 10000 ) ;
res[ 0 ] [ 1 ] %= 10000 ;
res[ 1 ] [ 0 ] = ( m1[ 1 ] [ 0 ] * m2[ 0 ] [ 0 ] % 10000 ) + ( m1[ 1 ] [ 1 ] * m2[ 1 ] [ 0 ] % 10000 ) ;
res[ 1 ] [ 0 ] %= 10000 ;
res[ 1 ] [ 1 ] = ( m1[ 1 ] [ 0 ] * m2[ 0 ] [ 1 ] % 10000 ) + ( m1[ 1 ] [ 1 ] * m2[ 1 ] [ 1 ] % 10000 ) ;
res[ 1 ] [ 1 ] %= 10000 ;
}
void MatrixPower ( int m1[ 2 ] [ 2 ] , int n, int res[ 2 ] [ 2 ] ) {
if ( n == 0 ) {
res[ 0 ] [ 0 ] = 1 ;
res[ 0 ] [ 1 ] = 0 ;
res[ 1 ] [ 0 ] = 0 ;
res[ 1 ] [ 1 ] = 1 ;
} else if ( n% 2 == 0 ) {
int temp[ 2 ] [ 2 ] ;
MatrixPower ( m1, n/ 2 , temp) ;
MatrixMultiply ( temp, temp, res) ;
} else {
int temp1[ 2 ] [ 2 ] ;
MatrixPower ( m1, n/ 2 , temp1) ;
int temp2[ 2 ] [ 2 ] ;
MatrixMultiply ( temp1, temp1, temp2) ;
MatrixMultiply ( temp2, m1, res) ;
}
}
int main ( )
{
int matrix[ 2 ] [ 2 ] ;
matrix[ 1 ] [ 0 ] = 1 ;
matrix[ 1 ] [ 1 ] = 0 ;
int a0, a1, p, q, k;
scanf ( "%d%d%d%d%d" , & a0, & a1, & p, & q, & k) ;
matrix[ 0 ] [ 0 ] = p;
matrix[ 0 ] [ 1 ] = q;
int res[ 2 ] [ 2 ] ;
MatrixPower ( matrix, k- 1 , res) ;
printf ( "%d\n" , ( res[ 0 ] [ 0 ] * a1% 10000 + res[ 0 ] [ 1 ] * a0% 10000 ) % 10000 ) ;
return 0 ;
}