Matemática
1
Wladimir Araújo Tavares
16 de março de 2017
3 Combinatória
Computação recursiva de an
1 ,n = 0
a ,n = 1
an =
(an/2 )
, n é par
a(an−1/2 )2
, n é ı́mpar
d ou ble pow ( d ou b le a , i n t n ) {
i f ( n==0) r e t u r n 1 ;
i f ( n==1) r e t u r n a ;
d ouble t = pow ( a , n / 2 ) ;
r e t u r n t * t * pow ( a , n %2);
}
d ou ble pow ( d ou b le a , i n t n ){
d ouble r e t = 1 ;
while ( n ){
i f ( n%2==1) r e t *= a ;
a *= a ;
n /= 2 ;
}
return ret ;
}
#i n c l u d e < s t d i o . h>
#i n c l u d e <math . h>
#i n c l u d e <v e c t o r >
u s i n g namespace s t d ;
t y p e d e f l o n g do u bl e LD ;
LD EPS = 1 e −8;
t y p e d e f s t r u c t MATRIX
{
i n t n ,m;
v e c t o r < v e c t o r <LD> > a ;
v o i d r e s i z e ( i n t x , i n t y , LD v = 0 . 0 ) ;
LD Gauss ( ) ;
int inverse ();
v e c t o r <LD> o p e r a t o r * ( v e c t o r <LD> v ) ;
MATRIX o p e r a t o r * (MATRIX M1 ) ;
v o i d show ( ) ;
}MATRIX ;
v o i d MATRIX : : r e s i z e ( i n t x , i n t y , LD v )
{
n=x ;
m=y ;
a . resize (n );
f o r ( i n t i =0; i <n ; i ++) a [ i ] . r e s i z e (m, v ) ;
}
i n t MATRIX : : i n v e r s e ( )
// assume n=m. r e t u r n s 0 i f n o t i n v e r t i b l e
{
int i , j , i i ;
MATRIX T ; T . r e s i z e ( n , 2 * n ) ;
f o r ( i =0; i <n ; i ++) f o r ( j =0; j <n ; j ++) T . a [ i ] [ j ]= a [ i ] [ j ] ;
f o r ( i =0; i <n ; i ++) T . a [ i ] [ i+n ] = 1 . 0 ;
T . Gauss ( ) ;
i f (T . n==0) r e t u r n 0 ;
f o r ( i =0; i <n ; i ++) f o r ( j =0; j <n ; j ++) a [ i ] [ j ]=T . a [ i ] [ j+n ] ;
return 1;
}
LD d e t (MATRIX &M)
// compute t h e d e t e r m i n a n t o f M
{
MATRIX M1=M;
LD r=M1 . Gauss ( ) ;
i f (M1 . n==0) r e t u r n 0 . 0 ;
return r ;
}
3 Combinatória
#i n c l u d e <map>
t y p e d e f map<i n t , i n t > prime map ;
v o i d s q u e e z e ( prime map& M, i n t& n , i n t p ) {
f o r ( ; n % p == 0 ; n /= p ) M[ p]++;
}
prime map f a c t o r ( i n t n ) {
prime map M;
i f ( n < 0 ) r e t u r n f a c t o r (−n ) ;
i f ( n < 2 ) r e t u r n M;
s q u e e z e (M, n , 2 ) ;
s q u e e z e (M, n , 3 ) ;
i n t maxP = s q r t ( n ) + 2 ;
f o r ( i n t p = 5 ; p < maxP ; p += 6 ) {
s q u e e z e (M, n , p ) ;
s q u e e z e (M, n , p +2);
}
i f ( n > 1 ) M[ n]++;
r e t u r n M;
}
S[1] = false ;
f o r ( i n t p = 2 ; p * p <= n ; p++){
i f (S [ p ]){
f o r ( i n t q = p * p ; q <= n ; q += p )
{
S[q] = false ;
}
}
}
f o r ( i n t p = 2 ; p <= n ; p++){
i f (S [ p ] ) primes . push back (p ) ;
}
return primes ;
}
Example:
gcd(15,12) = gcd(12,15%12)
= gcd(12, 3)
= gcd(3, 12 %3)
= gcd(3, 0)
= 3
i n t gcd ( i n t a , i n t b ) {
while ( b ){
i n t r = a%b ;
a = b;
b = r;
}
return a ;
}
/ * a pode s e r n e g a t i v o e n > 0 * /
i n t mod ( i n t a , i n t n ) {
p r i n t f ( ”mod(%d,%d ) = %d\n ” , a , n , ( a%n ) + a < 0 ? n : 0 ) ;
r e t u r n ( a%n + n)%n ;
}
i n t invmod ( i n t a , i n t n ) {
int d , x , y ;
d = gcd ( a , n , x , y ) ;
i f ( d==1)
r e t u r n mod ( x , n ) ;
}
/*
Achar a menor s o l u ç ã o n e g a t i v a de ax = b ( mod m)
Caso c o n t r á r i o , r e t o r n a −1
*/
i n t s o l v e m o d ( i n t a , i n t b , i n t m) {
i f (m < 0 ) r e t u r n s o l v e m o d ( a , b,−m) ;
i f ( a < 0 | | a>=m | | b < 0 | | b>=m)
s o l v e m o d ( mod ( a ,m) , mod ( b ,m) , m) ;
d = gcd ( a ,m, x , y ) ;
i f ( b %d != 0 ) r e t u r n −1;
e l s e r e t u r n mod ( x * ( b/d ) , m ) ;
}
3 Combinatória
#d e f i n e MAX 100
typedef long long i n t l l i ;
l l i C [MAX+ 1 ] [MAX+ 1 ] ;
void prebinom (){
C [ 0 ] [ 0 ] = 1LL ;
f o r ( i n t i = 1 ; i <= MAX; i ++){
f o r ( i n t j = 0 ; j <= i ; j ++){
i f ( j ==0) C [ i ] [ j ] = 1LL ;
e l s e i f ( j == i ) C [ i ] [ j ] =1LL ;
e l s e C [ i ] [ j ] = C [ i − 1 ] [ j −1] + C [ i − 1 ] [ j ] ;
}
}
}
Definição recursiva:
F0 = 0
F1 = 1
Fn = Fn−1 + F n − 2
Complexidade O(n)
Fórmula Fechada
√ √
Fn = √1 (( 1+ 5 )n − ( 1−2 5 )n )
5 2
Matriz de Recorrência
n
Fn+1 1 1 Fn 1 1 F
= × = × 1 (1)
Fn 1 0 Fn−1 1 0 F0
t e m p l a t e < c l a s s T> c l a s s m a t r i x {
public :
i n t m, n ;
v e c t o r < v e c t o r <T> > a ;
m a t r i x ( i n t m = 0 , i n t n =0);
v e c t o r <T>& o p e r a t o r [ ] ( i n t i ) { r e t u r n a [ i ] ; }
m a t r i x o p e r a t o r * ( m a t r i x M1 ) ;
m a t r i x power ( m a t r i x <T> M, i n t n ) ;
};
t e m p l a t e < c l a s s T>
m a t r i x <T> : : m a t r i x ( i n t m , i n t n ) : m(m) , n ( n ) {
a . r e s i z e (m) ;
f o r ( i n t i = 0 ; i < m; i ++) a [ i ] . r e s i z e ( n ) ;
}
t e m p l a t e < c l a s s T>
m a t r i x <T> m a t r i x <T> : : o p e r a t o r * ( m a t r i x <T> M1) {
m a t r i x R( n , M1 .m) ;
int i , j , k ;
f o r ( i =0; i <n ; i ++)
f o r ( j =0; j <M1 .m; j ++)
f o r ( k =0; k<m; k++)
R . a [ i ] [ j ]+=a [ i ] [ k ] * M1 . a [ k ] [ j ] ;
return R;
}
t e m p l a t e < c l a s s T>
m a t r i x <T> m a t r i x <T> : : power ( m a t r i x <T> M, i n t n ) {
i f ( n==0 | | n==1)
r e t u r n M;
m a t r i x R = power (M, n / 2 ) ;
R = R*R ;
i f ( n&1){
R = R*M;
}
return R;
}
m a t r i x <i n t > M( 2 , 2 ) ;
M[ 0 ] [ 0 ] = 1 ;
M[ 0 ] [ 1 ] = 1 ;
M[ 1 ] [ 0 ] = 1 ;
M[ 1 ] [ 1 ] = 0 ;
i f ( n ==0|| n==1) r e t u r n n ;
r e t u r n M[ 0 ] [ 0 ] ;
}