快速幂
# include <iostream>
using namespace std; int main ( ) { int a, b, p; cin>> a>> b>> p; int res = 1 % p; while ( b) { if ( b & 1 ) res = 1ll * res * a % p; a = 1ll * a * a % p; b >>= 1 ; } cout<< res; return 0 ;
}
斐波那契数列
# include <iostream>
using namespace std;
typedef long long ll;
const int Nmax= 10 , mod= 1e9 ; struct Matrix
{ int n, m; int map[ Nmax] [ Nmax] ; Matrix ( int x, int y) { n= x; m= y; for ( int i= 1 ; i<= n; i++ ) for ( int j= 1 ; j<= m; j++ ) map[ i] [ j] = 0 ; } Matrix operator * ( const Matrix b) { Matrix c ( n, b. m) ; if ( m== b. n) { for ( int i= 1 ; i<= c. n; i++ ) for ( int k= 1 ; k<= m; k++ ) for ( int j= 1 ; j<= c. m; j++ ) c. map[ i] [ j] = ( c. map[ i] [ j] + ( map[ i] [ k] * b. map[ k] [ j] ) % mod) % mod; return c; } printf ( "error!!!!!!!!!!!!!!\n" ) ; return c; } Matrix operator + ( const Matrix b) { Matrix c ( n, m) ; if ( m== b. m && n== b. n) { for ( int i= 1 ; i<= n; i++ ) for ( int j= 1 ; j<= m; j++ ) c. map[ i] [ j] = ( map[ i] [ j] + b. map[ i] [ j] ) % mod; return c; } printf ( "error!!!!!!!!!!!!!!\n" ) ; return c; } void show ( ) { printf ( "n:%d m:%d\n" , n, m) ; for ( int i= 1 ; i<= n; i++ ) for ( int j= 1 ; j<= m; j++ ) printf ( "%4d%c" , map[ i] [ j] , j== m? '\n' : ' ' ) ; }
} ;
int a, b, n;
int work ( )
{ Matrix base ( 2 , 2 ) ; base. map[ 1 ] [ 1 ] = a, base. map[ 1 ] [ 2 ] = b; base. map[ 2 ] [ 1 ] = 1 ; Matrix ans ( 2 , 2 ) ; ans. map[ 1 ] [ 1 ] = 1 , ans. map[ 2 ] [ 2 ] = 1 ; if ( n<= 2 ) return 0 * printf ( "1\n" ) ; n-= 2 ; while ( n) { if ( n& 1 ) ans= ans* base; base= base* base; n>>= 1 ; } Matrix now ( 2 , 1 ) ; now. map[ 1 ] [ 1 ] = now. map[ 2 ] [ 1 ] = 1 ; ans= ans* now; printf ( "%d\n" , ans. map[ 1 ] [ 1 ] ) ; return 0 ;
}
int main ( )
{ while ( ~ scanf ( "%d%d%d" , & a, & b, & n) ) { if ( ! a && ! b && ! n) break ; work ( ) ; } return 0 ;
}
a ^ n + b ^ n
# include <iostream>
using namespace std;
typedef unsigned long long ll;
const int Nmax= 10 ;
ll a, b, n; struct Matrix
{ int n, m; ll map[ Nmax] [ Nmax] ; Matrix ( int x, int y) { n= x; m= y; for ( int i= 1 ; i<= n; i++ ) for ( int j= 1 ; j<= m; j++ ) map[ i] [ j] = 0LLu ; } Matrix operator * ( const Matrix b) { Matrix c ( n, b. m) ; if ( m== b. n) { for ( int i= 1 ; i<= c. n; i++ ) for ( int k= 1 ; k<= m; k++ ) for ( int j= 1 ; j<= c. m; j++ ) c. map[ i] [ j] = c. map[ i] [ j] + map[ i] [ k] * b. map[ k] [ j] ; return c; } printf ( "error!!!!!!!!!!!!!!\n" ) ; return c; } Matrix operator + ( const Matrix b) { Matrix c ( n, m) ; if ( m== b. m && n== b. n) { for ( int i= 1 ; i<= n; i++ ) for ( int j= 1 ; j<= m; j++ ) c. map[ i] [ j] = map[ i] [ j] + b. map[ i] [ j] ; return c; } printf ( "error!!!!!!!!!!!!!!\n" ) ; return c; } void show ( ) { printf ( "n:%d m:%d\n" , n, m) ; for ( int i= 1 ; i<= n; i++ ) for ( int j= 1 ; j<= m; j++ ) printf ( "%4llu%c" , map[ i] [ j] , j== m? '\n' : ' ' ) ; }
} ; ll work ( )
{ Matrix base ( 2 , 2 ) ; base. map[ 1 ] [ 1 ] = a, base. map[ 1 ] [ 2 ] = - b; base. map[ 2 ] [ 1 ] = 1LLu ; Matrix ans ( 2 , 2 ) ; ans. map[ 1 ] [ 1 ] = 1LLu , ans. map[ 2 ] [ 2 ] = 1LLu ; ll newa= a* a- 2LLu * b; if ( n== 2 ) return newa; if ( n== 1 ) return a; if ( n== 0 ) return 2LLu ; n-= 2LLu ; while ( n) { if ( n& 1LLu ) ans= ans* base; base= base* base; n>>= 1 ; } Matrix now ( 2 , 1 ) ; now. map[ 1 ] [ 1 ] = newa; now. map[ 2 ] [ 1 ] = a; ans= ans* now; return ans. map[ 1 ] [ 1 ] ;
}
int main ( )
{ while ( ~ scanf ( "%llu%llu%llu" , & a, & b, & n) ) { if ( ! a && ! b && ! n) break ; printf ( "%llu\n" , work ( ) ) ; } return 0 ;
}