Cod sursa(job #971540)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 9 iulie 2013 15:40:04
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <algorithm>
#define Nmax 5000010
using namespace std;
ifstream f("pascal.in");
ofstream g("pascal.out");

int R,D,sol,Exp2[Nmax],Exp3[Nmax],Exp5[Nmax];

void CalcExp(int E[],int prim)
{
    for(int p=prim;p<=R;p*=prim)
        for(int i=p;i<=R;i+=p)E[i]++;
    for(int i=1;i<=R;i++)E[i]+=E[i-1];
}

void Init()
{
    f>>R>>D;
    if(!(D % 2))CalcExp(Exp2,2);
    if(!(D % 3))CalcExp(Exp3,3);
    if(!(D % 5))CalcExp(Exp2,5);
}


void SolvePrim(int E[])
{
    int i;
    for(i=0;i<R-i;i++)
            if(E[R]-E[i]-E[R-i])sol+=2;
    if(i==R-i && E[R]-E[i]-E[R-i])sol++;
}
void Solve(int D)
{
    if(D==2)SolvePrim(Exp2);
    if(D==3)SolvePrim(Exp3);
    if(D==5)SolvePrim(Exp5);
    if(D==4)
    {
        int i;
        for(i=0;i<R-i;i++)
            if( (Exp2[R]-Exp2[i]-Exp2[R-i])/2 )sol+=2;
        if(i==R-i &&  (Exp2[R]-Exp2[i]-Exp2[R-i])/2 )sol++;
    }
    if(D==6)
    {
        int i;
        for(i=0;i<R-i;i++)
         if( min((Exp2[R]-Exp2[R]-Exp2[R-i]),(Exp3[R]-Exp3[i]-Exp3[R-i])) )sol+=2;
        if(i==R-i && min((Exp2[R]-Exp2[i]-Exp2[R-i]),(Exp3[R]-Exp3[i]-Exp3[R-i])))sol++;
    }
}
int main()
{
    Init();
    Solve(D);
    g<<sol<<'\n';
    f.close();g.close();
    return 0;
}