Pagini recente » Cod sursa (job #77263) | Cod sursa (job #1076321) | Cod sursa (job #1890092) | Cod sursa (job #1104095) | Cod sursa (job #791882)
Cod sursa(job #791882)
#include <fstream>
#include <cstring>
#define MAX 1000005
#define ll long long
using namespace std;
int prm[MAX], n;
ll f[MAX], a, b;
bool p[MAX];
void ciur()
{
prm[++prm[0]] = 2;
for(int i = 3; i < MAX; i += 2)
if(!p[i])
{
prm[++prm[0]] = i;
for(int j = i; j < MAX; j += i)
p[j] = true;
}
}
ll solve(ll a, ll b)
{
f[0] = 0;
int i = 0;
while(b > 1)
{
i++;
if(b % prm[i] == 0)
{
f[++f[0]] = prm[i];
while(b % prm[i] == 0) b /= prm[i];
}
if(1LL * prm[i] * prm[i] > b && b > 1)
{
f[++f[0]] = b;
b = 1;
}
}
ll sol = a;
for(int conf = 1; conf < (1 << (f[0])); conf++)
{
ll prod = 1, nr = 0;
for(int i = 0; i < f[0]; i++)
if((1 << i) & conf)
{
nr++;
prod *= 1LL * f[i + 1];
}
if(nr & 1) nr = -1;
else nr = 1;
sol += 1LL * nr * a / prod;
}
return sol;
}
int main()
{
ifstream in("pinex.in"); ofstream out("pinex.out");
in>>n; ciur();
while(n--)
{
in>>a>>b;
out<<solve(a, b)<<"\n";
}
in.close(); out.close();
return 0;
}