Cod sursa(job #2770653)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 22 august 2021 13:58:01
Problema Pascal Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
//Ilie Dumitru
#include<cstdio>
typedef long long ll;

int p[3][5000005];

int get(int a, int x)
{
    int s=0;
    while(!(a%x))
        ++s, a/=x;
    return s;
}

void precomp(int R)
{
    int i;
    p[0][0]=p[0][1]=p[1][0]=p[1][1]=p[2][0]=p[2][1]=0;
    for(i=2;i<=R;++i)
    {
        p[0][i]=p[0][i-1]+get(i, 2);
        p[1][i]=p[1][i-1]+get(i, 3);
        p[2][i]=p[2][i-1]+get(i, 5);
    }
}

inline int min(int a, int b) {return a+(b-a)*(b<a);}

int main()
{
    FILE *f=fopen("pascal.in", "r"), *g=fopen("pascal.out", "w");
    int D, R, N, i, ans=0, x=0;
    fscanf(f, "%d%d", &R, &D);
    precomp(R);
    N=R>>1;
    switch(D)
    {
    case 2:
        for(i=1;i<N;++i)
            ans+=(p[0][R]>p[0][i]+p[0][R-i]);
        if(!(R&1))
            x=(p[0][R]>p[0][i]+p[0][R-i]);
        break;
    case 3:
        for(i=1;i<N;++i)
            ans+=(p[1][R]>p[1][i]+p[1][R-i]);
        if(!(R&1))
            x=(p[1][R]>p[1][i]+p[1][R-i]);
        break;
    case 4:
        for(i=1;i<N;++i)
            ans=((p[0][R]>>1)>((p[0][i]+p[0][R-i])>>1));
        if(!(R&1))
            x=((p[0][R]>>1)>(p[0][i]+p[0][R-i])>>1);
        break;
    case 5:
        for(i=1;i<N;++i)
            ans+=(p[2][R]>p[2][i]+p[2][R-i]);
        if(!(R&1))
            x=(p[2][R]>p[2][i]+p[2][R-i]);
        break;
    case 6:
        for(i=1;i<N;++i)
            ans+=(p[0][R]>p[0][i]+p[0][R-i])*(p[1][R]>p[1][i]+p[1][R-i]);
        if(!(R&1))
            x=(p[0][R]>p[0][i]+p[0][R-i])*(p[1][R]>p[1][i]+p[1][R-i]);
    }
    fprintf(g, "%d", (ans<<1)+x);
    fclose(f);
    fclose(g);
    return 0;
}