Cod sursa(job #2196034)

Utilizator sergiudnyTritean Sergiu sergiudny Data 18 aprilie 2018 09:34:19
Problema Mins Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <bits/stdc++.h>
#define DM 1005
#define pb push_back
#define ll long long
using namespace std;
ifstream fin("mins.in");
ofstream fout("mins.out");

ll c,d,ans;
vector<ll>pr,desc;
bitset<DM>isPrime;

void ciur(){
    isPrime[0]=isPrime[1]=1;
    int i=2;
    for(;i*i<DM;++i) if(!isPrime[i]){
        pr.pb(i);
        for(int j=i*i;j<DM;j+=i)
            isPrime[j]=1;
    }
    for(;i<DM;++i) if(!isPrime[i])
        pr.pb(i);
}

void descomp(int x){
    desc.clear();
    for(auto i:pr){
        if(x%i==0){
            desc.pb(i);
            while(x%i==0) x/=i;
        }
        if(x==1) break;
    }
    if(x>1) desc.pb(x);
}

int getAns(){
    int ansPart,a;
    ansPart = a = max(c,d);
    for(int i=1;i<(1<<desc.size());++i){
        ll prod=1,cnt=0;
        for(int j=0;(1<<j)<=i;++j) if((1<<j)&i)
            cnt++,prod*=desc[j];
        if(cnt%2) ansPart-=a/prod;
        else ansPart+=a/prod;
    }
    return ansPart;
}

int main()
{
    fin>>c>>d;
    c--,d--;
    ciur();
    ans=0;
    for(int i=1;i<=min(c,d);++i){
        descomp(i);
        ans+=getAns();
    }
    fout<<ans;
    return 0;
}