Pagini recente » Cod sursa (job #1189839) | Cod sursa (job #2327654) | Cod sursa (job #1429575) | Cod sursa (job #2075611) | Cod sursa (job #1533573)
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
using namespace std;
ifstream in("pinex.in");
ofstream out("pinex.out");
const int maxv = 1000005;
bitset <maxv> ciur;
vector <int> primes;
vector <int> divi;
int main()
{
int T;
in >> T;
ciur[2] = 0;
ciur[1] = 1;
ciur[0] = 1;
for(int i = 4; i < maxv; i+=2)
ciur[i] = 1;
for(int i = 3; i < maxv; i+=2)
if(ciur[i] == 0)
for(int j = i * 2; j < maxv; j+=i)
ciur[j] = 1;
for(int i = 2; i < maxv; i++)
if(!ciur[i])
primes.push_back(i);
for(int z = 1; z <= T; z++)
{
long long a, b;
in >> a >> b;
divi.clear();
for(unsigned int i = 0 ; i < primes.size() && 1LL * primes[i] * primes[i] <= b ; ++ i) {
if(b % primes[i] == 0) {
divi.push_back(primes[i]);
while(b % primes[i] == 0)
b /= primes[i];
}
}
if(b != 1)
divi.push_back(b);
/// abcdefgh
/// 00001000 &
/// 00000000
int n = divi.size();
long long rasp = 0;
for(int conf = 1; conf < (1 << n); conf++)
{
int nrb = 0;
long long p = 1;
for(int i = 0 ; i < n ; ++ i)
if(conf & (1 << i)) {
nrb++;
p = p * divi[i];
}
if(nrb % 2 == 1)
rasp += a/p;
else
rasp -= a/p;
}
out << a - rasp << "\n";
}
return 0;
}