Cod sursa(job #2893944)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 26 aprilie 2022 20:57:42
Problema Pascal Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
//Ilie Dumitru
#include<cstdio>
typedef long long ll;

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

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

int cntR[2], a[2], b[2];

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