Cod sursa(job #1691408)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 18 aprilie 2016 11:33:18
Problema Pascal Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>
int div[4],exp[4],vf[4],vf1[4];
inline void cauta(int *v,int nr,int m){
     int i,p;
     for(i=0;i<m;i++){
        p=div[i];
        while(p<=nr){
           v[i]=v[i]+nr/p;
           p=p*div[i];
        }
    }
}
int main(){
    FILE*fi,*fout;
    int i,j,r,d,x,m,e,con,nr;
    fi=fopen("pascal.in" ,"r");
    fout=fopen("pascal.out" ,"w");
    fscanf(fi,"%d%d" ,&r,&d);
    x=2;
    m=0;
    while(x*x<=d){
       e=0;
       while(d%x==0){
          d/=x;
          e++;
       }
       if(e>0){
          div[m]=d;
          exp[m]=e;
          m++;
       }
       x++;
    }
    if(d>1){
        div[m]=d;
        exp[m]=1;
        m++;
    }
    cauta(vf,r,m);
    cauta(vf1,r,m);
    con=0;
    for(j=0;j<(r+1)/2;j++){
        i=0;
        while(i<m&&vf[i]-vf1[i]>=exp[i])
           i++;
        if(i==m)
          con++;
        for(i=0;i<m;i++){
           nr=r-j;
           while(nr%div[i]==0){
              nr/=div[i];
              vf1[i]--;
           }
           nr=j+1;
           while(nr%div[i]==0){
              nr/=div[i];
              vf1[i]++;
           }
        }
    }
    con=2*con;
    if(r%2==0){
     j=r/2;
     for(i=0;i<4;i++)
           vf1[i]=0;
        cauta(vf1,j,m);
        cauta(vf1,r-j,m);
        i=0;
        while(i<m&&vf[i]-vf1[i]>=exp[i])
           i++;
        if(i==m)
          con++;
    }
    fprintf(fout,"%d" ,con);
    fclose(fi);
    fclose(fout);
    return 0;
}