Cod sursa(job #59196)

Utilizator floringh06Florin Ghesu floringh06 Data 8 mai 2007 17:04:11
Problema Pascal Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
using namespace std;

#include<stdio.h>
#include<cmath>
#include<fstream>

#define limdiv 10

FILE *fin=fopen("pascal.in","r"),
     *fout=fopen("pascal.out","w");

int n,lim,i,j,dd;
int m;
int sol;

struct desc
{
   int n;
   int p;
};

desc d[limdiv];
int nr[limdiv];


void descomp()
 {
    int vl,m1;
    memset(d,0,sizeof(d));
    j=0;
    i=2;
    m1=dd;
    while (m1!=1 && i<=dd)
     if (m1%i==0)
     {
       vl=0;
       while (m1%i==0)
	     { vl++; m1/=i; }
       j++;
       d[j].n=i;
       d[j].p=vl;
     }  else i++;
   if (m1!=1) { d[++j].n=m1; d[j].p=1; }
   lim=j;
 }

int get_on()
 {
  int i,k;
  k=0;
  for (i=1; i<=lim; i++)
   if (nr[i]<d[i].p) { k=1; break; }
  return k;   
 }
        
void solve()
 {
    int i,k,up,down;
    memset(nr,0,sizeof(nr));
    for (k=0; k<=n/2-1; k++)
      {
       up=n-k;
       down=k+1;
       for (i=1; i<=lim; i++)
      	if (up%d[i].n==0)
	   while (up%d[i].n==0) {  nr[i]++; up/=d[i].n; }
       for (i=1; i<=lim; i++)
        if (down%d[i].n==0)
	   while (down%d[i].n==0) { nr[i]--; down/=d[i].n; }
       if ((get_on()==0) && (k<n/2-1) && ((n+1) % 2==1)) sol+=2;
       if ((get_on()==0) && (k<n/2) && ((n+1) % 2==0)) sol+=2;
       if ((get_on()==0) && (k==n/2-1) && ((n+1)%2==1)) sol++;
      }                 
}       
     
int main()
{
    fscanf(fin,"%d%d",&n,&dd);
    if (n==0 && dd==1){ fprintf(fout,"%d",1); return 0; }
     else if (n==0) {fprintf(fout,"%d",0); return 0; }
    descomp();
    if (dd==1) { fprintf(fout,"%d",n+1);  return 0; }
      else solve();
    fprintf(fout,"%d\n",sol); 
 fclose(fin);
 fclose(fout);
return 0;
}