Pagini recente » Monitorul de evaluare | Cod sursa (job #2425948) | Cod sursa (job #1880933) | Cod sursa (job #1040971) | Cod sursa (job #3154214)
//#include <iostream>
#include <fstream>
using namespace std;
ifstream in("pinex.in");
ofstream out("pinex.out");
long long d[12]; // d[1].....d[n]
int n;
long long a, b, ans;
int s[12];
bool ciur[1000001];
int p[200000]; // p[1]=2 p[2]=3 .......p[cnt]<=1 000 000
int cnt;
void calculare()
{
ciur[0] = 1;
ciur[1] = 1;
for (int i = 2; i*i <= 1000001; i++)
if (!ciur[i])
{
for (int j = i; i * j <= 1000001; j++)
ciur[ i*j ]=1;
}
for (int i = 2; i <= 1000001; i++)
if (!ciur[i])
p[++cnt] = i;
}
void produs (int k)
{
long long p = 1;
for(int i = 1; i<= k; i++)
p *= d[ s[i] ];
if(k%2==0) ans = ans - a / p;
else
ans += (a / p);
}
void bkt (int k, int nr)
{
for (int i = s[k-1]+1 ; i <= n+k-nr; i++)
{
s[k] = i;
if (k == nr)
produs(k);
else
bkt(k + 1,nr) ;
}
}
int main()
{
int m;
in >> m;
calculare();
//cout<<cnt<<'\n';
for(int i=1; i<=m; i++)
{
in >> a >> b;
ans=0;
n=0;
for(int j=1; j<=cnt && p[j]*p[j]<=b ; j++)
if(b%p[j]==0)
{
d[++n]=p[j];
while(b%p[j]==0)
b/=p[j];
}
if(b>1)
{
n++;
d[n]=b;
}
for(int j=1; j<=n; j++)
bkt(1, j);
out << a- ans << '\n';
}
return 0;
}