Pagini recente » Cod sursa (job #854030) | Cod sursa (job #1521866) | Cod sursa (job #2670725) | Cod sursa (job #1021746) | Cod sursa (job #1753290)
#include <iostream>
#include <fstream>
using namespace std;
const int MAX = 1000001;
int ciurn[MAX]; //Vector al numarului de divizori primi
int ciurp[MAX]; //Ciurul numerelor divizibile cu patrate de numere prime
//(i.e. la care nu toti divizorii primi sunt distincti)
ifstream f("mins.in");
ofstream g("mins.out");
int main()
{
int c, d; //Datele de intrare
f >> c >> d;
c--, d--;
int n = min(c, d);
long long m = 1LL * c * d; //Numarul de segmente (initial este egal cu numarul de puncte)
for(int i = 2; i <= n; i++)
{
if(ciurn[i] == 0)
{
for(int j = i; j <= n; j += i)
ciurn[j]++;
long long k = 1LL * i * i;
for(long long jj = k; jj <= n; jj += k)
ciurp[jj] = 1;
}
if(ciurp[i] == 0)
{
long long t = 1LL * (c / i) * (d / i);
if(ciurn[i] % 2 == 0)
m += t;
else
m -= t;
}
}
g << m << endl;
f.close();
g.close();
return 0;
}