Cod sursa(job #2951276)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 5 decembrie 2022 20:47:51
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#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;
}