Cod sursa(job #2320196)

Utilizator lucaperjuLuca Perju Verzotti lucaperju Data 14 ianuarie 2019 15:00:59
Problema Pascal Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>

using namespace std;
ifstream cin ("pascal.in");
ofstream cout ("pascal.out");
long long mod;
long long d[6];
int ciur2[5000003];
int ciur3[5000003];
int ciur5[5000003];
void upd (long long val)
{
    d[2]+=ciur2[val];
    d[3]+=ciur3[val];
    d[5]+=ciur5[val];
}
void sct (long long val)
{
    while(!(val&1LL))
    {
        val>>=1LL;
        --d[2];
    }
    while(!(val%3))
    {
        val/=3;
        --d[3];
    }
    while(!(val%5))
    {
        val/=5;
        --d[5];
    }
    d[2]-=ciur2[val];
    d[3]-=ciur3[val];
    d[5]-=ciur5[val];
}
int main()
{
    long long r,i,cur=0,cnt=0,inmul,imp=2;
    cin>>r>>mod;
    inmul=r-1;
    for(i=2;i<=r;i+=2)
        ciur2[i]=1+ciur2[i/2];
    for(i=3;i<=r;i+=3)
        ciur3[i]=1+ciur3[i/3];
    for(i=5;i<=r;i+=5)
        ciur5[i]=1+ciur5[i/5];
    upd(r);
    if(mod==2 && d[2])
            ++cnt;
        else
        if(mod==3 && d[3])
            ++cnt;
        else
        if(mod==4 && d[2]>1)
            ++cnt;
        else
        if(mod==5 && d[5])
            ++cnt;
        else
        if(mod==6 && min(d[2],d[3]))
            ++cnt;
    while(inmul>r/2+1)
    {
        upd(inmul);
        sct(imp);
        --inmul;
        ++imp;
        if(mod==2 && d[2])
            ++cnt;
        else
        if(mod==3 && d[3])
            ++cnt;
        else
        if(mod==4 && d[2]>1)
            ++cnt;
        else
        if(mod==5 && d[5])
            ++cnt;
        else
        if(mod==6 && min(d[2],d[3]))
            ++cnt;
    }
    if(r%2==0)
    {
        cnt*=2;
        upd(inmul);
        sct(imp);
        --inmul;
        ++imp;
        if(mod==2 && d[2])
            ++cnt;
        else
        if(mod==3 && d[3])
            ++cnt;
        else
        if(mod==4 && d[2]>1)
            ++cnt;
        else
        if(mod==5 && d[5])
            ++cnt;
        else
        if(mod==6 && min(d[2],d[3]))
            ++cnt;
    }
    else
    {
        cnt*=2;
    }
    cout<<cnt;
    return 0;
}