Nu aveti permisiuni pentru a descarca fisierul grader_test45.ok
Cod sursa(job #1567642)
Utilizator | Data | 13 ianuarie 2016 17:12:35 | |
---|---|---|---|
Problema | Principiul includerii si excluderii | Scor | 60 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.88 kb |
#include <cstdio>
#include <vector>
using namespace std;
long long n;
long long a, b;
long long dimensiune;
long long numar;
bool ciur[1000000];
vector<long long> prime;
vector<long long> descompunere;
void createCiur()
{
for(long long i = 2; i < 1000000; i++)
{
if(ciur[i] == false)
{
prime.push_back(i);
for(long long j = i * 2; j < 1000000; j += i)
{
ciur[j] = true;
}
}
}
}
void descompune()
{
descompunere.clear();
for(long long i = 0; i < prime.size(); i++)
{
if(b % prime[i] == 0)
{
descompunere.push_back(prime[i]);
}
while(b % prime[i] == 0)
{
b /= prime[i];
}
if(prime[i] > b)
{
break;
}
}
if(b != 1)
{
descompunere.push_back(b);
b = 1;
}
dimensiune = descompunere.size();
}
int main()
{
freopen("pinex.in", "r", stdin);
freopen("pinex.out", "w", stdout);
createCiur();
scanf("%lld", &n);
for(long long i = 0; i < n; i++)
{
scanf("%lld %lld", &a, &b);
descompune();
numar = 0;
for(long long x = 1; x < (1 << dimensiune); x++)
{
long long produs = 1;
long long nr = 0;
for(long long j = 0; j < dimensiune; j++)
{
if((x & (1 << j)) != 0)
{
nr++;
produs *= descompunere[j];
}
}
if(nr % 2 != 0)
{
numar += (a / produs);
}
else
{
numar -= (a / produs);
}
}
printf("%lld\n", a - numar);
}
return 0;
}