Cod sursa(job #2893943)

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

int p[3][5000005];

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

int factCnt(int a, int x)
{
    if(!a)
        return 0;
    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, stop;
    fscanf(f, "%d%d", &R, &D);
    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;
}