Mai intai trebuie sa te autentifici.
Cod sursa(job #1890220)
Utilizator | Data | 23 februarie 2017 10:14:55 | |
---|---|---|---|
Problema | Principiul includerii si excluderii | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.32 kb |
#include <fstream>
using namespace std;
ifstream f("pinex.in");
ofstream g("pinex.out");
long long comp[1000005],q,t,x,k;
long long zac[1000005], np;
bool prim[1000005];
long long query() {
int t = 0, cnt = 0, i,j, x1 = x;
long long tmp = 0, t2 = 0, sol = 0;
for (i = 1; k > 1; i++) {
if (k%zac[i]==0) {
cnt = 0;
while (k%zac[i]==0)
k /= zac[i];
comp[++t] = zac[i];
if (1LL*zac[i]*zac[i] >k && k > 1) {
comp[++t] = k;
break;
}
}
}
for (i = 1; i < (1<<t);i++) {
t2 = 1,cnt = 0;
for (j = 0; j <= t;j++)
if ((i&(1<<j))) {
t2 = 1LL*t2*comp[j+1];
cnt++;
}
if (cnt %2)
cnt = 1;
else cnt = -1;
tmp+= 1LL*cnt*x/t2;
}
sol = x-tmp;
return sol;
}
void ciur() {
int i, j;
prim[2] = 0;
zac[np=1] = 2;
for (i = 3; i <= 1000000; i+=2)
if (prim[i] == 0) {
zac[++np] = i;
for (j=3*i; j <= 1000000; j += 2*i+1)
prim[j] = 1;
}
}
int main() {
ciur();
f >> q;
while (q--) {
f >>x>>k;
g << query() << '\n';
}
return 0;
}