Cod sursa(job #1031599)

Utilizator geniucosOncescu Costin geniucos Data 15 noiembrie 2013 18:08:44
Problema Dtcsu Scor 0
Compilator cpp Status done
Runda FMI No Stress 4 Marime 2.38 kb
#include<cstdio>
#include<fstream>
#include<queue>
#include<algorithm>
using namespace std;
ifstream f("dtcsu.in");
#define MaxChar 100000
#define verf ( (++CharB==MaxChar) ? ( f.read(Buffer,MaxChar),CharB=0 ) : (1) )
int CharB;
char ch,Buffer[MaxChar];
void cit(long long &a)
{
    a=0;
    for (;!((Buffer[CharB]>='0'&&Buffer[ CharB ]<='9')||(Buffer[CharB]=='-'));verf);
    for (a=0;(Buffer[CharB]>='0'&&Buffer[CharB]<='9');a*=10,a+=(Buffer[CharB]-'0'),verf);
}
int i,p,u,mij,ras,n5,n7,n11,T,sol;
long long V,INF,p3[70],p5[70],p2[70],p11[70],p7[70];
int main()
{
freopen("dtcsu.out","w",stdout);
f>>T;
f.get();
INF=1000000000000000000*1LL;
p3[0]=p5[0]=p7[0]=p11[0]=1;
for(i=0;i<=59;i++)
    p2[i]=(1LL<<i)-1;
for(i=1;i<=37;i++)
    p3[i]=1LL*p3[i-1]*3;
for(i=1;i<=100;i++)
{
    p5[i]=1LL*p5[i-1]*5;
    if(p5[i]<0||p5[i]>INF) break;
    n5=i;
}
for(i=1;i<=100;i++)
{
    p7[i]=1LL*p7[i-1]*7;
    if(p7[i]<0||p7[i]>INF) break;
    n7=i;
}
for(i=1;i<=100;i++)
{
    p11[i]=1LL*p11[i-1]*11;
    if(p11[i]<0||p11[i]>INF) break;
    n11=i;
}
while(T)
{
    T--;
    cit(V);
    p=0;
    u=59;
    ras=0;
    while(p<=u)
    {
        mij=(p+u)>>1;
        if((V&p2[mij])==0)
        {
            ras=mij;
            p=mij+1;
        }
        else u=mij-1;
    }
    V/=1LL<<ras;
    ////////////////////////////////
    p=0;
    u=37;
    ras=0;
    while(p<=u)
    {
        mij=(p+u)>>1;
        if(V%p3[mij]==0)
        {
            ras=mij;
            p=mij+1;
        }
        else u=mij-1;
    }
    V/=p3[ras];
    ////////////////////////////////
    p=0;
    u=n5;
    ras=0;
    while(p<=u)
    {
        mij=(p+u)>>1;
        if(V%p5[mij]==0)
        {
            ras=mij;
            p=mij+1;
        }
        else u=mij-1;
    }
    V/=p5[ras];
    ////////////////////////////////
    p=0;
    u=n7;
    ras=0;
    while(p<=u)
    {
        mij=(p+u)>>1;
        if(V%p7[mij]==0)
        {
            ras=mij;
            p=mij+1;
        }
        else u=mij-1;
    }
    V/=p7[ras];
////////////////////////////////
    p=0;
    u=n11;
    ras=0;
    while(p<=u)
    {
        mij=(p+u)>>1;
        if(V%p11[mij]==0)
        {
            ras=mij;
            p=mij+1;
        }
        else u=mij-1;
    }
    V/=p11[ras];
    if(V==1) sol++;
}
printf("%d\n",sol);
return 0;
}