Cod sursa(job #240744)

Utilizator DraStiKDragos Oprica DraStiK Data 8 ianuarie 2009 14:28:07
Problema Pascal Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <stdio.h>
#define DIM 5000005
int a[DIM],b[DIM];
int r,d,nrt;
int fact (int x,int d)
{
    int s=0;
    while (x%d && x)
    {
        s++;
        x/=d;
    }
    return s;
}
int main ()
{
    freopen ("pascal.in","r",stdin);
    freopen ("pascal.out","w",stdout);    
    int i;
    scanf ("%d%d",&r,&d);
    if (r%2==0)
    {
        for (i=1; i<=r/2; ++i)
            if (d==2 || d==3 ||d==5)
            {
                a[i]=a[i-1]+fact (r-i+1,d)-fact (i,d);
                if (a[i]>0)
                    ++nrt;
                if (i==r/2)
                {
                    --nrt;
                    nrt*=2;
                    a[i+1]=a[i]+fact (r-i+2,d)-fact (i+1,d);
                    if (a[i+1]>0)
                        ++nrt;
                }
            }
            else if (d==4)
            {
                a[i]=a[i-1]+fact (r-i+1,2)-fact (i,2);
                if (a[i]>1)
                    ++nrt;
                if (i==r/2)
                {
                    --nrt;
                    nrt*=2;
                    a[i+1]=a[i]+fact (r-i+2,2)-fact (i+1,2);
                    if (a[i+1]>1)
                        ++nrt;
                }
            }
            else if (d==6)
            {
                a[i]=a[i-1]+fact (r-i+1,2)-fact (i,2);
				b[i]=b[i-1]+fact (r-i+1,3)-fact (i,3);
				if(a[i]>0 && b[i]>0)
					++nrt;
				if(i==r/2)
				{
                    --nrt;
					nrt*=2;
					a[i+1]=a[i]+ fact (r-i+2,2)-fact (i+1,2);
					b[i+1]=b[i]+ fact (r-i+2,3)-fact (i+1,3);
					if(a[i+1]>0 && b[i+1]>0)
						++nrt;
				}
            }
    }
    else
    {
        for (i=1; i<=r/2; ++i)
            if (d==2 || d==3 ||d==5)
            {
                a[i]=a[i-1]+fact (r-i+1,d)-fact (i,d);
                if (a[i]>0)
                    ++nrt;
            }
            else if (d==4)
            {
                a[i]=a[i-1]+fact (r-i+1,2)-fact (i,2);
                if (a[i]>1)
                    ++nrt;
            }
            else if (d==6)
            {
                a[i]=a[i-1]+fact (r-i+1,2)-fact (i,2);
				b[i]=b[i-1]+fact (r-i+1,3)-fact (i,3);
				if(a[i]>0 && b[i]>0)
					++nrt;
            }
        nrt*=2;
    }
    printf ("%d",nrt);
    return 0;
}