Cod sursa(job #3297430)

Utilizator Arhiva_Educationala_2Arhiva Educationala doi Arhiva_Educationala_2 Data 22 mai 2025 16:50:51
Problema Principiul includerii si excluderii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 kb
#include <stdio.h>
#include <vector>

using ll = long long;

ll pinex( ll a, ll b ) {
  std::vector<ll> primes; {
    int d = 2;
    while( d * (ll)d <= b ){
      if( b % d == 0 ){
        primes.push_back( d );
        while( b % d == 0 )
          b /= d;
      }
      d++;
    }

    if( b > 1 )
      primes.push_back( b );
  }

  ll ret = 0;
  for( int mask = (1 << (int)primes.size()); mask--; ){
    ll prod = 1;
    for( int i = 0; i < (int)primes.size(); i++ )
      if( mask & (1 << i) )
        prod *= primes[i];
    
    ret += (a / prod) * (__builtin_popcount(mask) % 2 == 0 ? +1 : -1);
  }

  return ret;
}

int main() {
  FILE *fin = fopen( "pinex.in", "r" );
  FILE *fout = fopen( "pinex.out", "w" );

  int t;
  for( fscanf( fin, "%d", &t ); t--; ){
    ll a, b;
    fscanf( fin, "%lld %lld", &a, &b );
    fprintf( fout, "%lld\n", pinex( a, b ) );
  }

  fclose( fin );
  fclose( fout );
  return 0;
}