Nu aveti permisiuni pentru a descarca fisierul grader_test19.ok

Cod sursa(job #476070)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 9 august 2010 17:52:43
Problema Mins Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<cstdio>
int tot,x,y,n,pr[10],sol[10],rez[1<<20],nr[1<<20];
void read()
{
    freopen("mins.in","r",stdin);
    freopen("mins.out","w",stdout);
    scanf("%d%d",&x,&y);
}
void calc(int a)
{
    int nrt=1,q=0;
    for(int i=1;i<=n;i++)
        if(sol[i]==1)
            nrt*=pr[i], q++;
    if(q%2==0 && q)
        tot-=(a/nrt);
    else if(q) tot+=(a/nrt);
}
void back(int poz,int a)
{
    if(poz>n)
    {
        calc(a);
        return;
    }
    sol[poz]=0;
    back(poz+1,a);
    sol[poz]=1;
    back(poz+1,a);
}
void dfp(int x)
{
    for(int i=2;i*i<=x;i++)
        if(x%i==0)
        {
            pr[++n]=i;
            x/=i;
        }
    if(x>1)
        pr[++n]=x;
}
void reset()
{
    tot=n=0;
}
int calc(int a,int b)
{
    reset();
    dfp(b);
    back(1,a);
    return a-tot;
}
void init()
{
    for(int i=1;i<=x;i++)
        nr[i]=1;
}
void solve()
{
    init();
    rez[1]=y-1;
    for(int i=2;i<x;i++)
    {
        if(nr[i]==1)
            for(int j=i;j<=x;j+=i)
                nr[j]*=i;
        if(nr[i]==i)
            rez[i]=calc(y-1,i);
        else rez[i]=rez[nr[i]];
    }
    int rasp=0;
    for(int i=1;i<=x;i++)
        rasp+=rez[i];
    printf("%d",rasp);
}
int main()
{
    read();
    solve();
    return 0;
}