Cod sursa(job #240746)

Utilizator DraStiKDragos Oprica DraStiK Data 8 ianuarie 2009 14:55:13
Problema Pascal Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <stdio.h>
#define DIM 5005
int a[DIM],b[DIM];
int r,d,nrt;
int fact (int x,int d)
{
    int s=0;
	while (x%d==0 && 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*=2;
					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*=2;
					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*=2;
					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;
}