Pagini recente » Cod sursa (job #111321) | Cod sursa (job #1107639) | Cod sursa (job #2038732) | Cod sursa (job #2259189) | Cod sursa (job #2574185)
#include <bits/stdc++.h>
#define NMAX 200005
#define VALMAX 1000000
#define ADD 400005
using namespace std;
typedef long long ll;
vector<int> prime, toIt;
bool ciur[VALMAX];
int dp[2][NMAX], st[2][NMAX], nr[3];
ll rez = 0;
void make_ciur(){
for(int i = 2; i <= VALMAX; ++i)
if(ciur[i] == 0){
prime.push_back(i);
for(ll j = i + i; j <= VALMAX; j += i)
ciur[j] = 1;
}
}
void build(int A, int B){
int cB = B;
for(int i = 0; i < prime.size() && prime[i] <= B; ++i)
if(B % prime[i] == 0){
dp[0][++nr[0]] = prime[i];
st[0][nr[0]] = nr[0];
rez += A / prime[i];
toIt.push_back(prime[i]);
while(cB % prime[i] == 0)
cB /= prime[i];
}
else if(prime[i] > sqrt(cB) && cB != 1){
dp[0][++nr[0]] = cB;
st[0][nr[0]] = nr[0];
rez += A / cB;
toIt.push_back(cB);
return;
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
freopen("pinex.in", "r", stdin);
freopen("pinex.out", "w", stdout);
int t;
cin >> t;
make_ciur();
while(t--){
ll A, B;
cin >> A >> B;
toIt.push_back(0);
rez = 0;
build(A, B);
int lim = nr[0];
int curL = 1, lastL = 0;
for(int pas = 2; pas <= lim; ++pas){
for(int i = 1; i <= nr[lastL]; ++i)
for(int j = st[lastL][i] + 1; j <= lim; ++j)
if(dp[lastL][i] * toIt[j] <= A){
dp[curL][++nr[curL]] = dp[lastL][i] * toIt[j];
st[curL][nr[curL]] = j;
if(pas % 2 == 0)
rez -= A / dp[curL][nr[curL]];
else rez += A / dp[curL][nr[curL]];
}
else break;
nr[lastL] = 0;
curL = 1 - curL;
lastL = 1 - lastL;
}
cout << A - rez << '\n';
toIt.clear();
nr[0] = nr[1] = 0;
}
return 0;
}