Pagini recente » Cod sursa (job #1523094) | Cod sursa (job #1712800) | Cod sursa (job #306894) | Cod sursa (job #898789) | Cod sursa (job #2438073)
#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);
}