Cod sursa(job #2146514)

Utilizator WebDesignbyTMGhiorghiu Ioan-Viorel WebDesignbyTM Data 28 februarie 2018 00:30:44
Problema Mins Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#define DM 1000001
#define	DN 12
#include <bitset>
#include <cstring>
#include <fstream>
using namespace std;

ifstream fi ("mins.in");
ofstream fo ("mins.out");
bitset <DM/2+1> bs;
int a, b, d, prm[DM/2+1], dv[DN], aux, rez, mltm, smn;
long long sol;

int main()
{
	//ciur
	prm[++prm[0]] = 2;
	for (int i = 1; ((i*i) << 1) + (i << 1) < DM; ++i)
		if (!bs[i])
			for (int j = ((i*i) << 1) + (i << 1); (j << 1) + 1 < DM; j += (i << 1) + 1)
				bs[j] = 1;
	for (int i = 1; i < DM/2+1; ++i)
		if (!bs[i])
			prm[++prm[0]] = (i << 1) + 1;


	fi >> a >> d;
	--a;
	--d;
	for (int i = 2; i <= d; ++i)
	{
		rez = 0;
		b = i;

		//descompunere in factori
		for (int j = 1; j <= prm[0] && prm[j]*prm[j] <= b; ++j)
			if (b%prm[j] == 0)
			{
				dv[++dv[0]] = prm[j];
				while (b%prm[j] == 0)
					b /= prm[j];
			}
		if (b > 1)
			dv[++dv[0]] = b;


		//pinex
		mltm = (1 << dv[0]) - 1;
		for (int j = 1; j <= mltm; ++j)
		{
			aux = 1;
			smn = 0;
			for (int k = 0; k < dv[0]; ++k)
				if (j&(1 << k))
				{
					aux *= dv[k+1];
					++smn;
				}
			if (smn&1)
				rez += a/aux;
			else
				rez -= a/aux;
		}
		sol += a - rez;
		memset(dv, 0, sizeof(dv));
	}
	fo << sol + a;
	return 0;
}