Cod sursa(job #2438073)

Utilizator r00t_Roman Remus r00t_ Data 11 iulie 2019 11:33:18
Problema Fractii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <Windows.h>
#include <time.h>
#include <algorithm>
#include <map>

using namespace std;

ifstream fin("fractii.in");
ofstream fout("fractii.out");

//fractii using Stein's algorithm
template<class T>
bool even(T x)
{
	if (x % 2 == 0)
		return 1;
	else
		return 0;
}

template<class T>
T SteinGCD(T n, T m)
{
	// make numbers positive
	if (n < T(0)) n = -n;
	if (m < T(0)) m = -m;

	if (m == T(0)) return n;
	if (n == T(0)) return m;

	int d_m = 0;
	while (even(m)) { m >>= 1; ++d_m; } // we substract 2s from m until m is odd

	int d_n = 0;
	while (even(n)) { n >>= 1; ++d_n; } // same for n


	while (n != m)
	{
		if (n > m) swap(n, m);
		m -= n;
		do {
			m >>= 1;
		} while (even(m));
	}
	
	return m << min(d_m, d_n);
}

//sieve

bool sieve[1000000];

void buildSieve(int n)
{
	for (int i = 3; i <= n; i += 2)
	{
		for (int j = i * 3; j <= n; j += i * 2)
			sieve[j] = 1;
	}
}

bool isPrime(int k)
{
	if (k % 2 == 0 && k!=2)return 0;
	return sieve[k];
}

int solveFractii(int n)
{
	buildSieve(n);
	int cnt = 0;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			if (i == 1 || j == 1) {
				cnt++;
				continue;
			}
			if (isPrime(i) == 1 && j%i != 0)
			{
				cnt++;
				continue;
			}
			if (isPrime(j) == 1 && i%j != 0)
			{
				cnt++;
				continue;
			}
			if (i == j)continue;
			if (i % 2 == 0 && j % 2 == 0)continue;
			if (SteinGCD(i, j) == 1)cnt++;
		}
	}
	return cnt;

}

int main()
{
	int n;
	fin >> n;
	fout << solveFractii(n);


}