距阵的乘法,关键是要熟悉距阵乘法的结合率,可以用N*LOGN的算法过。
#include <stdio.h>

typedef struct
{
    
int a11, a12;
    
int a21, a22;
}
type;

void Mul ( type *a, type *b, type *c )//a*b->c
{
    
    c
->a11 = ( a->a11*b->a11 + a->a12*b->a21 ) % 10000;
    c
->a12 = ( a->a11*b->a12 + a->a12*b->a22 ) % 10000;
    c
->a21 = ( a->a21*b->a11 + a->a22*b->a21 ) % 10000;
    c
->a22 = ( a->a21*b->a12 + a->a22*b->a22 ) % 10000;
}


void Cpy ( type *a, type *b )//a=b
{

    a
->a11 = b->a11;
    a
->a12 = b->a12;
    a
->a21 = b->a21;
    a
->a22 = b->a22;
}


type sum, count, temp, t;
type e 
= 1001 };
type s 
= 1110 };

int main ()
{

    
int n;

    
while ( scanf ( "%d"&n ) != EOF && n >= 0 )
    
{
        
if ( n == 0 )
        
{
            printf ( 
"0\n" );
            
continue;
        }

        
if ( n == 1 )
        
{
            printf ( 
"1\n" );
            
continue;
        }


        n 
= n-2;
        Cpy ( 
&sum, &e );
        Cpy ( 
&count, &s );
        
while ( n )
        
{
            
if ( n & 1 )
            
{
                Mul ( 
&sum, &count, &temp );
                Cpy ( 
&sum, &temp );
            }

            n 
>>= 1;
            Cpy ( 
&t, &count );
            Mul ( 
&count, &t, &temp );
            Cpy ( 
&count, &temp );
        }


        printf ( 
"%d\n", ( sum.a11 + sum.a12 ) % 10000 );

    }

    
return 0;
}