Pagini recente » Cod sursa (job #1229715) | Cod sursa (job #979031) | Cod sursa (job #3202126) | Cod sursa (job #321493) | Cod sursa (job #3220021)
#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>
using namespace std;
typedef long long ll;
string file = "pinex";
ifstream fin (file + ".in");
ofstream fout (file + ".out");
int v[20], cap;
ll n, x;
inline void divizori()
{
cap = 0;
if (!(x & 1))
{
v[cap++] = 2;
do
{
x /= 2;
}while (!(x & 1));
}
if (x%3 == 0)
{
v[cap++] = 3;
do
{
x /= 3;
}while (x % 3 == 0);
}
for (int d = 5; 1ll*d*d<=x; d+=6)
{
if (x % d == 0)
{
v[cap++] = d;
do
{
x /= d;
}while (x % d == 0);
}
int d2 = d+2;
if (x % d2 == 0)
{
v[cap++] = d2;
do
{
x /= d2;
}while (x % d2 == 0);
}
}
if (x>1)
v[cap++] = x;
}
inline ll solve()
{
divizori();
ll s = 0;
for (int i = 1; i < (1 << cap); i++)
{
ll p = 1;
int nb = 0;
for (int j = 0; j < cap; j++)
{
if (i & (1 << j))
{
p *= v[j];
nb++;
}
}
if (nb & 1)
{
s += n / p;
}
else
{
s -= n / p;
}
}
return s;
}
int main ()
{
int m;
fin >> m;
do
{
fin >> n >> x;
fout << n-solve() << '\n';
}while (--m);
}