Pagini recente » Cod sursa (job #82448) | Cod sursa (job #184045) | Cod sursa (job #202288) | Cod sursa (job #1031118) | Cod sursa (job #2951276)
#include <fstream>
#include <climits>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <bitset>
#include <map>
#include <cstring>
#include <algorithm>
#define NMAX LLONG_MAX
using namespace std;
ifstream fin("frac.in");
ofstream fout("frac.out");
unsigned long long int cartezianMultime,numitor,numar;
vector<long long int>diviz;
void divPrimi(long long int val)
{
diviz.clear();
for (long long int i = 2; i * i <= val; i++)
{
if (val % i == 0)
{
diviz.push_back(i);
while (val % i == 0)
{
val /= i;
}
}
}
if (val > 1)
{
diviz.push_back(val);
}
}
void backtrackGenerareElemente(int indexMultime, long long int divizorComun, int pozUltimAdaugat, unsigned long long int upper)
{
if (indexMultime > 0)
{
if (indexMultime % 2 == 0)
{
//scad
cartezianMultime = cartezianMultime - upper / divizorComun;
}
else {
cartezianMultime = cartezianMultime + upper / divizorComun;
}
}
for(int i = pozUltimAdaugat + 1; i < diviz.size(); i++)
{
divizorComun = divizorComun * diviz[i];
backtrackGenerareElemente(indexMultime + 1, divizorComun, i,upper);
divizorComun /= diviz[i];
}
}
int main()
{
fin >> numitor>>numar;
divPrimi(numitor);
unsigned long long int st = 1, dr = LLONG_MAX-(1<<5);
while (st <= dr)
{
unsigned long long int mij = (st + dr) / 2;
cartezianMultime = 0;
backtrackGenerareElemente(0, 1, -1,mij);
unsigned long long int calc = mij - cartezianMultime;
if (calc < numar)
{
st = mij + 1;
}
else {
dr = mij - 1;
}
}
fout << st;
return 0;
}