Cod sursa(job #2037154)

Utilizator dragos231456Neghina Dragos dragos231456 Data 11 octombrie 2017 20:01:27
Problema Pascal Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("pascal.in");
ofstream g("pascal.out");
int v[4][5000005];
int r,d,nr,x,rez,last,a,b,c,a1,b1,c1;

void umple(int l,int val)
{
    for(int i=val;i<=r;i+=val)
    {
        x=i; nr=0;
        while(x%val==0)
        {
            ++nr;
            x/=val;
        }
        v[l][i]=nr+v[l][i-val];
    }
}

void factoriale()
{
    x=d;
    if(d==4) x/=2;
    if(d==6) x/=3;
    umple(1,x);
    if(d==6) umple(2,3);
}

bool ver1(int i)
{
    a=(r/d)*d;
    b=(i/d)*d;
    c=((r-i)/d)*d;
    return(v[1][a]>v[1][b]+v[1][c]);
}

bool ver2(int i)
{
    a=(r/2)*2;
    b=(i/2)*2;
    c=((r-i)/2)*2;
    return (v[1][a]>1+v[1][b]+v[1][c]);
}

bool ver3(int i)
{
    a=(r/2)*2;
    b=(i/2)*2;
    c=((r-i)/2)*2;
    a1=(r/3)*3;
    b1=(i/3)*3;
    c1=((r-i)/3)*3;
    return(v[1][a]>v[1][b]+v[1][c] && v[2][a1]>v[2][b1]+v[2][c1]);
}

bool cond(int i)
{
    if(d==2 || d==3 || d==5) return ver1(i);
    if(d==4) return ver2(i);
    else return ver3(i);

}

int main()
{
    f>>r>>d;
    factoriale();
    for(int i=0;i<=r/2;++i)
    {
        last=rez;
        if(cond(i))
        {
            ++rez;
        }
    }
    if(r%2==0) rez+=last;
    else rez+=rez;
    g<<rez;
    return 0;
}