Cod sursa(job #10199)

Utilizator raula_sanChis Raoul raula_san Data 27 ianuarie 2007 23:20:49
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include<cstdio>

long N, sol; int D;

long F(int D, long x);

int main()
{
    freopen("pascal.in", "r", stdin);
    freopen("pascal.out", "w", stdout);
    
    scanf("%ld %d", &N, &D);
    
    long i, limit, n, m, k, n1, m1, k1;
    
    limit = !(N&1) ? (N>>1) - 1 : (N>>1);
    
    for(i=1; i<=limit; ++i)
    {
             if(D == 2 || D == 3 || D == 5)
             {
                  n = F(D, N);
                  m = F(D, N-i);
                  k = F(D, i);
                  
                  if( (n-m-k) >= 1 )
                      ++ sol;
             }
             if(D == 4)
             {
                  n = F(2, N);
                  m = F(2, N-i);
                  k = F(2, i);
                  
                  if( (n-m-k) >= 2 )
                      ++ sol;
             }
             if(D == 6)
             {
                  n = F(2, N);
                  m = F(2, N-i);
                  k = F(2, i);
                  n1 = F(3, N);
                  m1 = F(3, N-i);
                  k1 = F(3, i);
                  
                  if( (n-m-k) >= 1 && (n1-m1-k1) >= 1 )
                      ++ sol;
             }
    }
    
    sol <<= 1;
    
    if( !(N&1) )
    {
        if(D == 2 || D == 3 || D == 5)
        {
             n = F(D, N);
             m = F(D, N>>1) << 1;
             
             if( (n-m) >= 1 )
                 ++ sol;
        }
        if(D == 4)
        {
             n = F(2, N);
             m = F(2, N>>1) << 1;
             
             if( (n-1) >=2 )
                 ++ sol;
        }
        if(D == 6)
        {
             n = F(2, N);
             m = F(2, N>>1) << 1;
             n1 = F(3, N);
             m1 = F(3, N>>1) << 1;
             
             if( (n-m) >= 1 && (n1-m1) >=1 )
                 ++ sol;
        }
    }
    
    printf("%ld", sol);
    
    fclose(stdin); fclose(stdout);
    return 0;
}

long F(int D, long x)
{
     long s = 0;
     while(x)
     {
             s += x / D;
             x /= D;
     }
     return s;
}