Cod sursa(job #2278105)

Utilizator theo2003Theodor Negrescu theo2003 Data 7 noiembrie 2018 11:47:17
Problema Frac Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <vector>
#include <fstream>
#include <bitset>
#include <cmath>
#include <algorithm>
using namespace std;
int calcpieces(int n, int p, int perpiece, vector<int> &div) {
	int x = p/perpiece*n;
	int y = p - (p%perpiece);
    x-=n;
    y-=perpiece;
	for(; y!=p; x++) {
		for(int div_ : div) {
			if((x%div_)==0)
				goto fail;
		}

		y++;
	fail:
		continue;
	}

	return x - 1;
}
ifstream in("frac.in") ;
ofstream out("frac.out");
int main() {
	bitset<109545> prime;
	prime[0] = 1;
	prime[1] = 1;
	short int i[67] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331};

	for(int x = 0; x<67; x++) {
		for(int y = i[x] + i[x]; y<109545; y+=i[x])
			prime[y] = 1;
	}

	long long int n, p;
	in>>n>>p;

	if((n<109545)&&!prime[n]) {
		vector<int> x;
		x.push_back(n);
		out<<calcpieces(n, p, n - 1, x);
		return 0;
	}

	int upper = -1;

	for(int x = sqrt(n) + 1; x>=2; x--) {
		if((!prime[x])&&((n%x)==0)) {
			upper = x;
			break;
		}
	}

	if(upper==-1) {
		vector<int> x;
		x.push_back(n);
		out<<calcpieces(n, p, n - 1, x);
		return 0;
	}

	vector<int> divs;
	divs.push_back(upper);

	for(int x = upper - 1; x>=2; x--) {
		if((!prime[x])&&((n%x)==0))
			divs.push_back(x);
	}

	int perpiece_ = upper;

	for(int x = 1; x<=upper; x++) {
		for(int div_ : divs) {
			if((x%div_)==0)
				goto fail;
		}

		continue;
	fail:
		perpiece_--;
	}

	out<<calcpieces(upper, p, perpiece_, divs);
}