Cod sursa(job #656581)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 4 ianuarie 2012 20:40:17
Problema Pascal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.3 kb
#include <cstdio>

#define MAX 5000001

using namespace std;

int multiplu2[MAX];
int multiplu3[MAX];
int multiplu5[MAX];

int n, multiplu;

void citire()
{
    freopen("pascal.in", "r", stdin);
    scanf("%d %d", &n, &multiplu);
    fclose(stdin);
}

void generareVector()
{
    if(multiplu == 2 || multiplu == 4)
    {
        multiplu2[0] = 0;
        int t = 0, j;
        for(int i = 1; i <= n; i++)
        {
            j = i;
            t = 0;
            while(!(j % 2))
            {
                t++;
                j/=2;
            }
            multiplu2[i] = multiplu2[i - 1] + t;
        }
    }
    if(multiplu == 3)
    {
        multiplu3[0] = 0;
        int t = 0, j;
        for(int i = 1; i <= n; i++)
        {
            j = i;
            t = 0;
            while(!(j%3))
            {
                t++;
                j/=3;
            }
            multiplu3[i] = multiplu3[i-1] + t;
        }
    }
    if(multiplu == 5)
    {
        multiplu5[0] = 0;
        int t, j;
        for(int i = 1; i <= n; i++)
        {
            j = i;
            t = 0;
            while(!(j%5))
            {
                t++;
                j/=5;
            }
            multiplu5[i] = multiplu5[i - 1] + t;
        }
    }
    if(multiplu == 6)
    {
        multiplu2[0] = 0;
        multiplu3[0] = 0;
        int t2, t3, j;
        for(int i = 1; i <= n; i++)
        {
            j = i;
            t2 = 0;
            t3 = 0;
            while(!(j%3))
            {
                t3++;
                j/=3;
            }
            while(!(j%2))
            {
                t2++;
                j/=2;
            }
            multiplu2[i] = multiplu2[i - 1] + t2;
            multiplu3[i] = multiplu3[i - 1] + t3;
        }
    }
}

int totalNumber()
{
    int contor = 0;
    if(multiplu == 2)
    {
        for(int i = 0; i <= n/2; i++)
        {
            if((multiplu2[n] - multiplu2[n - i] - multiplu2[i] > 0))
            {
                contor += 2;
            }
        }
    }
    if(multiplu == 3)
    {
        for(int i = 0; i <= n/2; i++)
        {
            if((multiplu3[n] - multiplu3[n - i] - multiplu3[i] > 0))
            {
                contor += 2;
            }
        }
    }
    if(multiplu == 4)
    {
        for(int i = 0; i <= n/2; i++)
        {
            if((multiplu2[n] - multiplu2[n - i] - multiplu2[i] > 1))
            {
                contor += 2;
            }
        }
    }
    if(multiplu == 5)
    {
        for(int i = 0; i <= n/2; i++)
        {
            if((multiplu5[n] - multiplu5[n - i] - multiplu5[i] > 0))
            {
                contor += 2;
            }
        }
    }
    if(multiplu == 6)
    {
        for(int i = 0; i <= n/2; i++)
        {
            if((multiplu2[n] - multiplu2[n - i] - multiplu2[i] > 0) && (multiplu3[n] - multiplu3[n - i] - multiplu3[i] > 0))
            {
                contor += 2;
            }
        }
    }
    if(n % 2 == 0)
        contor--;
    return contor;
}

void afisare()
{
    freopen("pascal.out", "w", stdout);
    printf("%d", totalNumber());
    fclose(stdout);
}

int main()
{
    citire();
    generareVector();
    afisare();
    return 0;
}