Pagini recente » Cod sursa (job #506003) | Cod sursa (job #2081729) | Monitorul de evaluare | Cod sursa (job #1512052) | Cod sursa (job #2025010)
#include<fstream>
#include<iostream>
#include<vector>
using namespace std;
ifstream fin("pinex.in");
ofstream fout("pinex.out");
const int NMax = 100000;
bool Prim[NMax + 5];
int X[32];
int A,B,M,P,Sol;
vector <int> Div;
void Sieve()
{
for(int i = 2 ; i <= NMax ; ++i)
{
if(!Prim[i])
for(int j = 2 * i ; j <= NMax ; j += i)
Prim[j] = 1;
}
}
void Back(int k)
{
for(int i = X[k-1] + 1 ; i <= Div.size() ; ++i)
{
X[k] = i;
P *= Div[X[k] - 1];
if(k % 2) Sol += A / P;
else Sol -= A / P;
if(k < Div.size()) Back(k + 1);
P /= Div[X[k] - 1];
}
}
void Solve()
{
fin >> M;
while(M--)
{
fin >> A >> B;
for(int i = 2 ; i * i <= B ; ++i)
if(!Prim[i] && !(B % i))
{
Div.push_back(i);
while(!(B % i))
B /= i;
}
if(!Prim[B]) Div.push_back(B);
P = 1; Sol = 0;
Back(1);
fout << A - Sol << "\n";
Div.clear();
}
}
int main()
{
Sieve();
Solve();
fin.close();
fout.close();
return 0;
}