Cod sursa(job #935472)

Utilizator dariusdariusMarian Darius dariusdarius Data 3 aprilie 2013 15:42:39
Problema Mins Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<stdio.h>
int p[10];
inline int sqr(int x)
{
    int ans=0;
    for(int pas=1<<13;pas;pas>>=1)
        if((ans+pas)*(ans+pas)<=x)
            ans+=pas;
    return ans;
}
long long pinex(int x,int y)
{
    ///numarul de numere <=x si prime cu y:
    int ans=x,q,nr,f=0,lim=sqr(y),d=2;
    while(d<=lim && y>1)
    {
        if(y%d==0)
        {
            p[f++]=d;
            while(y%d==0)
                y/=d;
        }
        d++;
    }
    if(y>1)
        p[f++]=y;
    for(int i=1;i<(1<<f);i++)
    {
        nr=0;q=1;
        for(int j=0;j<f;j++)
            if(i&(1<<j))
                nr++,q*=p[j];
        if(nr&1) ans-=x/q;
        else ans+=x/q;
    }
    return ans;
}
int main()
{
    freopen("mins.in","r",stdin);
    freopen("mins.out","w",stdout);
    int n,m;long long ans=0;
    scanf("%d%d",&m,&n);
    for(int i=1;i<n;i++)
        ans+=pinex(m-1,i);
    printf("%lld\n",ans);
    return 0;
}