Cod sursa(job #2723714)

Utilizator Rares31100Popa Rares Rares31100 Data 15 martie 2021 13:06:48
Problema Sum Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#define UI unsigned int
#define ULL unsigned long long
#define MAX (UI)100000

std::ifstream fin("sum.in");
std::ofstream fout("sum.out");
UI vf[256810], urm[256810], last[100001];
UI dv[10], t;

void adaugaVf(UI from, UI to)
{
	static UI nr = 0;
	vf[++nr] = to;
	urm[nr] = last[from];
	last[from] = nr;
}

ULL sumaG(ULL a)
{
	return a * (a + 1) / 2;
}

int main()
{
	for(UI i = 2; i <= MAX; i++)
		if(!last[i])
			for(UI j = i * 2; j <= MAX; j += i)
				adaugaVf(j, i);

	UI n, nr;
	ULL suma;
	fin >> n;

	while(n--)
	{
		fin >> nr;
		t = 0;

		for(UI k = last[nr]; k; k = urm[k])
			dv[t++] = vf[k];

		if(t == 0)
			fout << sumaG(nr * 2 - 1) - nr << '\n';
		else
		{
			suma = 0;
			nr *= 2;

			for(UI i = 0, iMax = (1 << t), nrMult = 0, dvMult = 1; i < iMax; i++, nrMult = 0, dvMult = 1)
			{
				for(UI j = 0; j < t; j++)
					if(i & (1<<j))
					{
						nrMult++;
						dvMult *= dv[j];
					}

				if(nrMult % 2)
					suma -= sumaG(nr / dvMult) * dvMult;
				else
					suma += sumaG(nr / dvMult) * dvMult;
			}

			fout << suma << '\n';
		}
	}

	return 0;
}