Cod sursa(job #137871)

Utilizator cos_minBondane Cosmin cos_min Data 17 februarie 2008 15:45:33
Problema Factoriale Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <stdio.h>
#include <vector>
#include <fstream>
using namespace std;

#define in "factoriale.in"
#define out "factoriale.out"
#define dim 101

int N, K;
int X[dim], H[dim], M[3*dim];
bool Sel[dim];

vector<int> DivP;

void Power(int,int);

int main()
{
    memset(Sel,0,sizeof(Sel));
    memset(H,0,sizeof(H));
    
    for ( int i = 2; i <= 100; i++ )
        for ( int j = 2; i*j <= 100; j++ )
            Sel[i*j] = 1;
    
    for ( int i = 2; i <= 100; i++ )
        if ( !Sel[i] ) DivP.push_back(i);
    
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    scanf("%d%d", &N, &K);
    for ( int i = 1; i <= N; i++ )
        scanf("%d", &X[i]);
    
    for ( int i = 1; i <= N; i++ )
    {
        for ( int k = 2; k <= X[i]; k++ )
        {
            int T = k;
            
            for ( int j = 0; DivP[j]*DivP[j] <= T; j++ )
            {
                while ( T % DivP[j] == 0 )
                {
                      H[DivP[j]]++;
                      T /= DivP[j];
                }
            }
            
            if ( T > 1 ) H[T]++;
        }
    }
    
    M[0] = M[1] = 1;
    
    for ( int i = 2; i <= 100; i++ )
    {
        if ( H[i] == 0 ) continue;
        
        if ( H[i] % K == 0 ) ;
        else 
        {
             Power( i, K - (H[i]%K) );
        }
    }
    
    for ( int i = M[0]; i >= 1; i-- )
        printf("%d", M[i]);
}

void Power(int B, int pow)
{
     for ( ; pow; pow-- )
     {
         int i, t = 0;
         for ( i = 1; i <= M[0] || t; i++, t/=10 )
             M[i] = ( t += M[i]*B )%10;
         
         M[0] = i-1;
     }
}