Cod sursa(job #52943)

Utilizator M@2Te4iMatei Misarca M@2Te4i Data 20 aprilie 2007 13:24:14
Problema Pascal Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<stdio.h>
#include<string.h>

long r,s;
int d,a[5000],rr[5000],ee[5000],ww[5000],q;

void citire()
{
freopen("pascal.in","r",stdin);
scanf("%lu%d",&r,&q);
fclose(stdin);
}

void desc(long w,int a[5000])
{
int d=2,max=0;
while (w>1)
      {
      if (w % d==0)
	 {
	 a[d]++;
	 w/=d;
	 if (d>max)
	    max=d;
	 }
	 else d++;
      }
a[0]=max;
}

void fct(long w,int q[5000])
{
long d;
memset(q,0,sizeof(q));
for (int i=1; i<=a[0]; i++)
    {
    if (a[i]!=0)
       {
       d=i;
       while (w/d>0)
	     {
	     q[i]+=w/d;
	     d*=i;
	     }
       }
    }
q[0]=a[0];
}

void calcul()
{
fct(r,rr);
for (long i=2; /*i<=(r/2)*/i<=r; i++)
    {
    memset(ee,0,sizeof(ee));
    memset(ww,0,sizeof(ww));
    fct(r-i,ee);
    fct(i,ww);
    int m=ww[0];
    if (rr[0]>m)
       m=rr[0];
    if (ee[0]>m)
       m=ee[0];
    for (long j=1;j<=m; j++)
	{
	ee[j]=rr[j]-(ee[j]+ww[j]);
	if (a[j]>0 && a[j]<=ee[j]+1)
	   s++;
	}
    }
}

void scriere()
{
freopen("pascal.out","w",stdout);
printf("%ld\n",s);
fclose(stdout);
}

int main()
{
citire();
memset(a,0,sizeof(a));
desc(q,a);
calcul();
scriere();
return 0;
}