Cod sursa(job #490111)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 4 octombrie 2010 22:04:57
Problema Mins Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<cstdio>
#include<stdlib.h>
int q,nrt,a,b,tot,x,y,n,pr[10],sol[10],rez[1<<20],nr[1<<20];
char v[1<<20][7];
bool prim[1<<20]={true};
char lung[1<<20];
void read()
{
    freopen("mins.in","r",stdin);
    freopen("mins.out","w",stdout);
    scanf("%d%d",&x,&y);
}

void add()
{
    if(q%2==0 && q)
        tot-=(a/nrt);
    else if(q) tot+=(a/nrt);
}
void back(int poz)
{
    if(poz>n)
    {
        add();
        return;
    }
    sol[poz]=0;
    back(poz+1);
    sol[poz]=1;
    nrt*=(int)v[b][poz];
    q++;
    back(poz+1);
    nrt/=(int)v[b][poz];
    q--;
}
int calc()
{
    n=lung[b]-1;
    tot=0;
    back(0);
    return a-tot;
}
void init()
{
    for(int i=1;i<x;i++)
       nr[i]=1;
}
void solve()
{
    init();
    long long rasp=y-1;
    for(int i=2;i<x;i++)
    {
        if(nr[i]==1)
            for(int j=i;j<x;j+=i)
                nr[j]*=i, v[j][lung[j]++]=i;
        if(nr[i]==i)
        {
            a=y-1;
            b=i;
            q=0;
            nrt=1;
            rasp+=(rez[i]=calc());
        }
        else rasp+=rez[nr[i]];
    }
    printf("%lld",rasp);
}
int main()
{
    read();
    solve();
    return 0;
}