Cod sursa(job #2090935)

Utilizator rares_ciocieaRares Andrei Ciociea rares_ciociea Data 18 decembrie 2017 21:06:46
Problema Pascal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>

using namespace std;
ifstream in("pascal.in");
ofstream out("pascal.out");
int v2[5000001],v3[5000001],v5[5000001];
short int expn2[5000001],expn3[5000001],expn5[5000001];
void expn(int n,int p,short int v[])
{
    int ci=n,exp=0,i;
    for(i=1; i<=n; i++)
    {
        exp=0;
        ci=i;
        while(ci%p==0)
            exp++,ci/=p;
        v[i]=exp;
    }
}
void legendre(int n,int p,int v[],short int exp[])
{
    int i,ci;
    v[0]=0;
    for(i=1; i<=n; i++)
    {
        ci=i;
        v[i]=v[i-1]+exp[i];
    }
}

int main()
{
    int r,d,i,j,cnt=0,ok=0;
    in>>r>>d;
    if(d==2||d==4||d==6)
    {
        expn(r,2,expn2);
        legendre(r,2,v2,expn2);
    }
    if(d==3||d==6)
    {
        expn(r,3,expn3);
        legendre(r,3,v3,expn3);
    }
    if(d==5)
    {
        expn(r,5,expn5);
        legendre(r,5,v5,expn5);
    }

    for(i=0; i<(r+1)/2; i++)
    {
        if(d==2)
            if(v2[r]-v2[r-i]-v2[i])
                ok++;
        if(d==3)
            if(v3[r]-v3[r-i]-v3[i])
                ok++;
        if(d==4)
            if(v2[r]-v2[r-i]-v2[i]>1)
                ok++;
        if(d==5)
            if(v5[r]-v5[r-i]-v5[i])
                ok++;
        if(d==6)
            if(v2[r]-v2[r-i]-v2[i] && v3[r]-v3[r-i]-v3[i])
                ok++;
    }
    if(r%2==0)
    {
        i=r/2;
        if(d==2)
            if(v2[r]-v2[r-i]-v2[i])
                cnt++;
        if(d==3)
            if(v3[r]-v3[r-i]-v3[i])
                cnt++;
        if(d==4)
            if(v2[r]-v2[r-i]-v2[i]>1)
                cnt++;
        if(d==5)
            if(v5[r]-v5[r-i]-v5[i])
                cnt++;
        if(d==6)
            if(v2[r]-v2[r-i]-v2[i] && v3[r]-v3[r-i]-v3[i])
                cnt++;
    }
    out<<ok*2+cnt;
    return 0;
}