Cod sursa(job #1969829)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 18 aprilie 2017 17:51:05
Problema Pascal Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cstdio>
#include <algorithm>
using namespace std;
FILE *f=fopen("pascal.in","r");
FILE *g=fopen("pascal.out","w");
int F[4];
int E[4];
int r[4];
int lg[3][5000005];
int D;
int R;
void desc(int D)
{
    if(D==2){F[0]=E[1]=1;F[1]=2;}
    else if(D==3){F[0]=E[1]=1;F[1]=3;}
    else if(D==4){F[0]=1;E[1]=2;F[1]=2;}
    else if(D==5){F[0]=1;E[1]=1;F[1]=5;}
    else if(D==6){F[0]=2;E[1]=1;E[2]=1;F[1]=2;F[2]=3;}
}
int log(int i,int val)
{
    if(!lg[i][val]&&val!=1&&val%F[i]==0)
        lg[i][val]=1+log(i,val/F[i]);
    return lg[i][val];
}
int mod(int val,int sgn)
{
    for(int i=1;i<=F[0];i++)
    {
        r[i]+=log(i,val);
    }
}
bool eval()
{
    int R=(1<<30);
    for(int i=1;i<=F[0];i++)
        R=min(R,r[i]/E[i]);
    return R>0;
}
int main()
{
    fscanf(f,"%d %d",&R,&D);
    desc(D);
    int rez=0;
    for(int i=1;i<(R+1)/2+(R+1)%2;i++)
    {
        mod(R-i+1,1);
        mod(i,-1);
        if(eval())
            rez+=(1+(2*i!=R));
    }
    fprintf(g,"%d",rez);
    fclose(f);
    fclose(g);
    return 0;
}