Cod sursa(job #1118071)

Utilizator andrettiAndretti Naiden andretti Data 23 februarie 2014 23:15:08
Problema Mins Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
#define pb push_back
#define maxn 1000005
using namespace std;

int n,m,Min;
int x[maxn];
bool sieve[maxn];
vector<int> l;
long long sol,nrt,nrr;

void read()
{
    scanf("%d%d",&n,&m);
    n--; m--; Min=min(n,m);
}

void preproc()
{
    for(int i=3;1LL*i*i<=Min;i+=2)
     if(!sieve[i])
      for(int j=i;1LL*i*j<=Min;j++)
       sieve[i*j]=true;

    l.pb(2);
    for(int i=3;i<=Min;i+=2)
     if(!sieve[i]) l.pb(i);

    sol=1LL*(max(n,m)-Min)*Min+2*Min-1;
    nrt=1LL*(Min-1)*(Min-1);
}

void back(int k,int sgn,long long p)
{
    if(k>1) nrr=nrr+1LL*sgn*(Min/p)*(Min/p);
    if(k>l.size() || p>Min) return;

    for(int i=x[k-1]+1;i<l.size();i++)
    {
        x[k]=i;
        back(k+1,-sgn,p*l[i]);
    }
}

int main()
{
    freopen("mins.in","r",stdin);
    freopen("mins.out","w",stdout);

    read();
    preproc();
    x[0]=-1; back(1,-1,1);
    sol=sol+nrt-nrr;
    printf("%lld",sol);

    fclose(stdin);
    fclose(stdout);
    return 0;
}