Pagini recente » Cod sursa (job #2141487) | Cod sursa (job #2342924) | Cod sursa (job #1855282) | Cod sursa (job #1177155) | Cod sursa (job #1752044)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("mins.in");
ofstream g ("mins.out");
const int PMAX = 1000000;
int c, d, nrd, nrp, divB[13], nrdiv;
unsigned char v[PMAX + 1];
int Prim[PMAX / 3]; //Numerele prime generate
int cmmdc (int a, int b) {
while (b > 0) {
int r;
r = a % b;
a = b;
b = r;
}
return a;
}
void ciur() {
int i, j;
for (i = 4; i <= PMAX; i += 2)
v[i] = 1;
for (i = 3; i * i <= PMAX; i += 2)
if (v[i] == 0)
for (j = i * i; j <= PMAX; j += i)
v[j] = 1;
nrp = 1;
Prim[1] = 2;
for (i = 3; i <= PMAX; i += 2)
if (v[i] == 0) Prim[++nrp] = i;
}
void divizoriB (int B) {
int i = 1;
nrdiv = 0;
while (1LL * Prim[i] * Prim[i] <= B) {
if (B % Prim[i] == 0) {
divB[++nrdiv] = Prim[i];
do
B = B / Prim[i];
while (B % Prim[i] == 0);
}
i++;
}
if (B > 1)
divB[++nrdiv] = B;
}
int main() {
ciur();
cin >> c >> d;
divizoriB (d);
for (int i = 1; i < c; i++) {
long long card = 0;
int nt = (1 << nrdiv);
for (int k = 1; k < nt; k++) {
long long produs = 1;
int nrbiti = 0, p2;
for (int j = 0; (p2 = 1 << j) <= k; j++)
if (p2 & k) {
produs *= divB[j + 1];
nrbiti++;
}
long long T = d / produs;
if (nrbiti % 2 == 0) card -= T;
else card += T;
}
nrd += d - card;
}
cout << nrd;
return 0;
}