Cod sursa(job #1752044)

Utilizator calin9819Costea Calin calin9819 Data 2 septembrie 2016 16:56:44
Problema Mins Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#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;
}