Cod sursa(job #2055834)

Utilizator CezarTDTodirisca Cezar CezarTD Data 3 noiembrie 2017 20:07:19
Problema Pascal Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("pascal.in");
ofstream fout("pascal.out");
int d[7],r,nr,divr,valid=1;
void verif(int validare,int putere,int i)
{
    int rsec,putere1,putere2,putfin,p;
    rsec=r-i;
    putere1=putere2=0;
    p=nr;
    while(p<=rsec)
    {
        putere1+=(rsec/p);
        p*=nr;
    }
    p=nr;
    while(p<=i)
    {
        putere2+=(i/p);
        p*=nr;
    }
    putfin=putere-putere1-putere2;
    if(putfin>=validare)
    {
        if(i==r/2)
        {
            if(r%2==0)divr+=1;
            else divr+=2;
        }
        else divr+=2;
    }
}
int main()
{
    d[4]=d[6]=1;
    fin>>r>>nr;
    if(nr!=6)
    {
        int p,putere=0;
        if(nr==4)
        {
            nr=2;
            valid=2;
        }
        p=nr;
        while(p<=r)
        {
            putere+=(r/p);
            p*=nr;
        }
        for(int i=1; i<=r/2; i++)
        {
            verif(valid,putere,i);
        }
    }
    else
    {
        int p2=2,p3=3,putere2=0,putere3=0;
        int rsec,aux,putfin2,putfin3;
        while(p2<=r)
        {
            putere2+=(r/p2);
            p2*=2;
        }
        while(p3<=r)
        {
            putere3+=(r/p3);
            p3*=2;
        }
        for(int i=1; i<=r/2; i++)
        {
            rsec=r-i;
            aux=0;
            p2=2;
            while(p2<=rsec)
            {
                aux+=(rsec/p2);
                p2*=2;
            }
            aux=0;
            putfin2=putere2-aux;
            while(p2<=i)
            {
                aux+=(i/p2);
                p2*=2;
            }
            putfin2-=aux;
            p3=3;
            aux=0;
            while(p3<=rsec)
            {
                aux+=(rsec/p3);
                p3*=3;
            }
            putfin3=putere3-aux;
            aux=0;
            while(p3<=i)
            {
                aux+=(i/p3);
                p3*=3;
            }
            putfin3-=aux;
            if(putfin2>=1 && putfin3>=1)
            {
                if(i==r/2)
                {
                    if(r%2==0)divr+=1;
                    else divr+=2;
                }
                else divr+=2;
            }
        }
    }
    fout<<divr;
    return 0;
}