Cod sursa(job #2091506)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 19 decembrie 2017 19:17:14
Problema Mins Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
ifstream in ("mins.in");
ofstream out("mins.out");
int const nmax = 1000000;
vector<int> v[5 + nmax];
int n , m;
void precompute(){
  for(int i = 2 ; i <= n ;i++){
    if(v[i].size() == 0){
      for(int j = i ; j <= n ;j += i){
        v[j].push_back(i);
      }
    }
  }
}
int cmmmc(int a ,int b){
  int pr = a * b;
  while(0 < b){
    int temp = a % b;
    a = b;
    b = temp;
  }
  return pr / a;
}
int solve(int number){
  int primes = v[number].size();
  int sum = 0 ;
  for(int i = 1 ; i < (1 << primes) ;i++){
    int p = 1;
    int scount = 0;
    for(int j = 0 ; j < primes ;j++){
      if(0 < (i & (1 << j))){
        p = cmmmc(p ,v[number][j]);
        scount++;
      }
    }
    if(scount % 2 == 1){
      sum += m / p;
    } else
      sum -= m / p;
  }
  return m - sum;
}
int main()
{
  in>>n>>m;
  n--;
  m--;
  precompute();
  int sum = m ,sum2 = m;
  for(int i = 2 ;i <= n ;i++){
    sum += solve(i);
    sum2 = sum;
  }
  out<<sum;
  return 0;
}