Cod sursa(job #2837496)

Utilizator loraclorac lorac lorac Data 22 ianuarie 2022 11:09:16
Problema Mins Scor 65
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("mins.in");
ofstream out("mins.out");
typedef long long ll;
const int lim=1e6+4;
vector<int> p[lim];
int phi[lim];
bool ok[lim];
int lp[lim];
int c,d;
ll ans;
int main()
{
    in>>c>>d; --c,--d;
    if(c>d) swap(c,d);
    phi[1]=d;
    ans+=1LL*phi[1];
    for(int i=2;i<=c;++i)
    {
        if(!ok[i])
        {
            for(int j=i;j<=c;j+=i)
            {
                p[j].push_back(i);
                ok[j]=true;
            }
            if(i<=c/i)
            for(int j=i*i;j<=c;j+=i*i)
                lp[j]=i;
        }
        if(lp[i]!=0)
        {
            phi[i]=phi[i/lp[i]];
            ans+=1LL*phi[i];
            continue;
        }
        int nr=p[i].size()-1;
        int last=p[i].back();
        int prod=1;
        for(int j=0;j<nr;++j)
            prod*=p[i][j];
        phi[i]=phi[prod];
        for(int mask=0;mask<(1<<nr);++mask)
        {
            int app=1;
            prod=last;
            for(int j=0;j<nr;++j)
            if(mask&(1<<j))
                ++app,prod*=p[i][j];
            if(app%2==1)
                phi[i]-=(d/prod);
            else phi[i]+=(d/prod);
        }
        ans+=1LL*phi[i];
    }
    out<<ans<<'\n';
    return 0;
}