Cod sursa(job #12498)

Utilizator devilkindSavin Tiberiu devilkind Data 4 februarie 2007 10:53:36
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <stdio.h>

FILE *f = fopen("pascal.in","rt"), *g = fopen("pascal.out","wt");

long int div[50][3],n,i,j,k,m,nrc,nrd,sol;

void citire()
{
fscanf(f,"%ld %ld",&n,&m);

long int x,d;
x=m;
d=2;
k=1;
while (x>1)
   {
   while (x%d==0) {div[k][1]++;x/=d;}
   if (div[k][1]) {div[k][0]=d;k++;}
   d++;
   }
nrd=k-1;
x=n;
for (i=1;i<=nrd;i++)
	{
	 while (x%div[i][0]==0) {div[i][2]++;x/=div[i][0];}
	 if (x==1) break;
	 }



}

int verif()
{
long int i;
for (i=1;i<=nrd;i++)
    if (div[i][1]>div[i][2]) return 0;
return 1;
}

void solve()
{
sol+=verif()*2;
long int x;
for (k=1;k<=n/2-1;k++)
    {
    x=n-k;
    for (i=1;i<=nrd;i++)
	  {
	  while (x%div[i][0]==0) {div[i][2]++;x/=div[i][0];}
	  if (x==1) break;
	  }

    x=k+1;
    for (i=1;i<=nrd;i++)
	 {
	  while (x%div[i][0]==0) {div[i][2]--;x/=div[i][0];}
	  if (x==1) break;
	  }
    if (k+1<n/2) sol+=verif()*2;
	else if (k+1==n/2) sol+=verif()+n%2;
    }
fprintf(g,"%ld",sol);
}


int main()
{
citire();
solve();
fclose(f);
fclose(g);
return 0;
}