Cod sursa(job #928743)

Utilizator assa98Andrei Stanciu assa98 Data 26 martie 2013 17:38:59
Problema Mins Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>
#include <vector>
using namespace std;

const int MV=1000000;

char c[1000100];
int f[1000100];


void ciur()
{
    for(int i=1;i<=MV;i++)
        f[i]=i;
    for(int d=2;d*d<=MV;d+=2)
    {
        if(!c[d])
        {
            f[d]=d;
            for(int i=d+d;i<=MV;i+=d)
            {
                c[i]=1;
                f[i]=d;
            }
        }

        if(d==2)
            d--;
    }
}

vector <int> desc(int a)
{
    vector<int>V;
    while(a!=1)
    {
        V.push_back(f[a]);
        int fact=f[a];
        while(a%fact==0)
            a/=fact;
    }
    return V;
}

int pinex(int a,int b)
{
    vector<int>v=desc(b);
    if(b==1)
        return a;
    int n=v.size();
    int sol=0;
    for(int i=1;i<(1<<n);i++)
    {
        int biti=0;
        int prod=1;
        for(int b=0;(1<<b)<=i;b++)
            if(i&(1<<b))
            {
                biti++;
                prod*=v[b];
            }
        if(biti%2)
            sol+=a/prod;
        else
            sol-=a/prod;
    }
    return a-sol;
}

int main()
{
    freopen("mins.in","r",stdin);
    freopen("mins.out","w",stdout);
    int n,m;
    ciur();
    scanf("%d%d",&m,&n);
    long long sol=0;
    for(int i=1;i<n;i++)
        sol+=pinex(m-1,i);
    printf("%lld",sol);
    return 0;
}