Cod sursa(job #1691419)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 18 aprilie 2016 12:38:33
Problema Pascal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <cstdio>
#define MAXR 5000000
int div[4],exp[4],vf[4],vf1[4];
char ciur[MAXR+1][2];
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,p;
    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]=x;
          exp[m]=e;
          m++;
       }
       x++;
    }
    if(d>1){
        div[m]=d;
        exp[m]=1;
        m++;
    }
    for(i=0;i<m;i++){
        p=div[i];
        while(p<=r){
           for(j=p;j<=r;j+=p)
             ciur[j][i]++;
           p*=div[i];
        }
    }
    cauta(vf,r,m);
    for(i=0;i<m;i++)
      vf1[i]=vf[i];
    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++){
           vf1[i]-=ciur[r-j][i];
           vf1[i]+=ciur[j+1][i];
        }
    }
    con=2*con;
    if(r%2==0){
       j=r/2;
       for(i=0;i<m;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;
}