Cod sursa(job #1691449)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 18 aprilie 2016 13:19:35
Problema Pascal Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <stdio.h>
#include <stdlib.h>
char d2[5000001],d3[5000001],d5[5000001];
int min(int a,int b)
{
    if(a<b)
        return a;
    return b;
}
int main()
{
    int n,d,k,z,e,nr,i,nr2,nr3;
    freopen("pascal.in","r",stdin);
    freopen("pascal.out","w",stdout);
    scanf("%d%d",&n,&d);
    for(k=1; k<=(n+1)/2+1; k++)
    {
        z=n-k+1;
        e=0;
        while(z%2==0)
        {
            e++;
            z/=2;
        }
        d2[k]=d2[k-1]+e;
        e=0;
        z=k;
        while(z%2==0)
        {
            e++;
            z/=2;
        }
        d2[k]-=e;
    }
    for(k=1; k<=(n+1)/2+1; k++)
    {
        z=n-k+1;
        e=0;
        while(z%3==0)
        {
            e++;
            z/=3;
        }
        d3[k]=d3[k-1]+e;
        e=0;
        z=k;
        while(z%3==0)
        {
            e++;
            z/=3;
        }
        d3[k]-=e;
    }
    for(k=1; k<=(n+1)/2+1; k++)
    {
        z=n-k+1;
        e=0;
        while(z%5==0)
        {
            e++;
            z/=5;
        }
        d5[k]=d5[k-1]+e;
        e=0;
        z=k;
        while(z%5==0)
        {
            e++;
            z/=5;
        }
        d5[k]-=e;
    }
    switch(d)
    {
        case 1 : printf("%d\n",n); break;
        case 2 : nr=0;
                 for(i=1; i<=(n-1)/2; i++)
                    nr+=(d2[i]>0);
                 nr*=2;
                 if((n-1)%2==1)
                    nr+=(d2[(n-1)/2+1]>0);
                 printf("%d\n",nr); break;
        case 3 : nr=0;
                 for(i=1; i<=(n-1)/2; i++)
                    nr+=(d3[i]>0);
                 nr*=2;
                 if((n-1)%2==1)
                    nr+=(d3[(n-1)/2+1]>0);
                 printf("%d\n",nr); break;
        case 4 : nr=0;
                 for(i=1; i<=(n-1)/2; i++)
                    nr+=(d2[i]>1);
                 nr*=2;
                 if((n-1)%2==1)
                    nr+=(d2[(n-1)/2+1]>1);
                 printf("%d\n",nr); break;
        case 5:  nr=0;
                 for(i=1; i<=(n-1)/2; i++)
                    nr+=(d5[i]>0);
                 nr*=2;
                 if((n-1)%2==1)
                    nr+=(d5[(n-1)/2+1]>0);
                 printf("%d\n",nr); break;
        case 6:  nr2=0;
                 for(i=1; i<=(n-1)/2; i++)
                    nr2+=(d2[i]>0);
                 nr2*=2;
                 if((n-1)%2==1)
                    nr2+=(d2[(n-1)/2+1]>0);
                 nr3=0;
                 for(i=1; i<=(n-1)/2; i++)
                    nr3+=(d3[i]>0);
                 nr3*=2;
                 if((n-1)%2==1)
                    nr3+=(d3[(n-1)/2+1]>0);
                 printf("%d\n",min(nr2,nr3)); break;
    }

    return 0;
}