Cod sursa(job #341710)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 19 august 2009 13:15:16
Problema Mins Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>
#include <math.h>

#define maxn 2000010
#define maxnr 2000010

using namespace std;

long long n, m, r, nr, pr, sum, d, x, wq, j, div;
long long sol;
long long dp[maxnr], f[maxnr], num[maxn];
char ciur[maxnr];
long long i, l, nrb, ndp;

void inex(long long nr, long long tip)
{
    long long c = (long long)(n / nr) * (m / nr);
    if(tip==0)
    {
        sol+=c;
    }
    else
    {
        sol-=c;
    }
}

void back(long long nr, long long div, long long poz)
{
    long long x;
    inex(nr, div%2);
    for(long long y=poz; y<=wq; y++)
    {
        x=nr*num[y];
        if(x<=n)
        {
            back(nr*num[y], div+1, y+1);
        }
        else
        {
            return;
        }
    }
}

int main()
{
    freopen("mins.in", "r", stdin);
    freopen("mins.out", "w", stdout);
    scanf("%d %d\n", &n, &m);
    n--;
    m--;
    if(n>m)
    {
        sol=n;
        n=m;
        m=sol;
    }
    sol=0;
    r=(long) sqrt(m);
    for(i=2; i<=m; i++)
    {
        if(ciur[i]==0)
        {
            wq++;
            num[wq]=i;
            if(i<=r )
            {
                for(j=i*i; j<=m; j+=i)
                {
                    ciur[j]=1;
                }
            }
        }
    }
    back(1, 0, 1);
    printf("%lld\n", sol);
    return 0;
}