Pagini recente » Cod sursa (job #919766) | Cod sursa (job #1161315) | Cod sursa (job #2489309) | Cod sursa (job #1561423) | Cod sursa (job #3220020)
#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;
}
ll bkt(ll multiplu, int k, int ind)
{
ll s(0);
if (k == 0)
{
s = n/multiplu;
}
else
{
for (int i = ind; i<cap; i++)
s += bkt(multiplu*v[i],k-1,i+1);
}
return s;
}
inline ll solve()
{
divizori();
ll s = 0;
for (int i=1; i<=cap; i++)
{
if (i&1)
{
s += bkt(1,i,0);
}
else
{
s -= bkt(1,i,0);
}
}
return s;
}
int main ()
{
int m;
fin >> m;
do
{
fin >> n >> x;
fout << n-solve() << '\n';
}while (--m);
}