Cod sursa(job #2787722)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 23 octombrie 2021 22:10:50
Problema Patrate2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <stdio.h>
 
#define BASE 100000
#define MAX 795
#define POW 46
#define POW1 15
#define POW2 4
 
int a[ MAX ];
int n; 
 
void inmultesc( int v[], long long a ) {
    long long t = 0;
    for( int i = 1; i <= v[ 0 ]; i++ ) {
        t += ( long long )v[ i ] * a;
        v[ i ] = t % BASE;
        t /= BASE;
    }
 
    while( t ) {
        v[ ++v[ 0 ] ] = t % BASE;
        t /= BASE;
    }
}
 
void put( int v[], long long aa, int b ) {
    for( int i = 1; i <= b; i++ )
        inmultesc( v, aa );
}

int main()
{
    FILE *fin = fopen( "patrate2.in", "r" );
    fscanf( fin, "%d", &n );
    fclose( fin );
 
    int i;
    a[ ++a[ 0 ] ] = 2;
    for( i = 2; i <= n; i++ )
        inmultesc( a, 2LL * i );
 
    int right = n * n - i + 1;
    put( a, ( 1LL << POW ), right / POW );
    right %= POW;
    put( a, ( 1LL << POW1 ), right / POW1 );
    right %= POW1;
    put( a, ( 1LL << POW2 ), right / POW2 );
    put( a, 2LL, right % POW2 );
 
    FILE *fout = fopen( "patrate2.out", "w" );
    fprintf( fout, "%d", a[ a[ 0 ] ] );
    for( int i = a[ 0 ] - 1; i > 0; i-- ) {
        //for( int b = BASE; b / 10 >= a[ i ]; b /= 10 )
          //  fprintf( fout, "0" );
        if( a[ i ] < BASE / 10000 ) {
            fprintf( fout, "0000" );
        } else if( a[ i ] < BASE / 1000) {
            fprintf( fout, "000" );
        } else if( a[ i ] < BASE / 100 )
            fprintf( fout, "00" );
        else if( a[ i ] < BASE / 10 )
            fprintf( fout, "0" );
        fprintf( fout, "%d", a[ i ] );
    }
    fclose( fout );
    return 0;
}