Cod sursa(job #3151823)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 22 septembrie 2023 22:55:37
Problema Mins Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>

#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

ifstream fin ("mins.in");
ofstream fout ("mins.out");

const int NMAX=1e6+5;
int mobius[NMAX];
bool ciur[NMAX];
int prime[NMAX];
int kon;

void precompute_mobius()
{
    int i,j;
    for(i=1;i<=NMAX-5;i++)
        mobius[i]=1;
    for(i=2;i*i<=NMAX-5;i++)
    {
        if(!ciur[i])
        {
            for(j=i*i;j<=NMAX-5;j+=i)
                ciur[j]=true;
        }
    }
    for(i=2;i<=NMAX-5;i++)
    {
        if(!ciur[i])
            prime[++kon]=i;
    }
    for(i=1;i<=kon;i++)
    {
        for(j=prime[i];j<=NMAX-5;j+=prime[i])
            mobius[j]=-mobius[j];
    }
    for(i=1;i<=kon,prime[i]*prime[i]<=NMAX-5;i++)
        for(j=prime[i]*prime[i];j<=NMAX-5;j+=prime[i]*prime[i])
            mobius[j]=0;
}

int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);

    int n,m,i,saiz;
    long long total=0;
    precompute_mobius();
    fin>>n>>m;
    saiz=min(n,m);
    for(i=1;i<saiz;i++)
        total+=((n-1)/i)*((m-1)/i)*mobius[i];
    fout<<total;
    fin.close();
    fout.close();
    return 0;
}