Pagini recente » Cod sursa (job #2596674) | Cod sursa (job #1882826) | Cod sursa (job #893991) | Borderou de evaluare (job #1036200) | Cod sursa (job #2878150)
//#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#define int long long
using namespace std;
const int NMAX = 1000003;
bool c[NMAX];
bool ciur[NMAX];
int nrp[NMAX];
void erat()
{
for (int i = 3; i * i < NMAX; i += 2)
if (!ciur[i])
{
for (int j = i * i; j < NMAX; j += (i << 1))
ciur[j] = 1;
}
for (int i = 3; i < NMAX; i += 2)
if (!ciur[i])
{
int p = i * i;
for (int j = p; j < NMAX; j += p)
c[j] = 1;
for (int j = i; j < NMAX; j += i)
nrp[j]++;
}
}
bool check(int val)
{
if (((val >> 1) & 1) == 0)
return 0;
return !c[val];
}
int nr(int val)
{
if ((val & 1) == 0 and val != 2)
ciur[val] = 1;
if (!ciur[val])
return 1;
int ans = nrp[val];
if (!(val & 1))
ans++;
return ans;
}
signed main()
{
ifstream cin("mins.in");
ofstream cout("mins.out");
erat();
int c, d;
cin >> c >> d;
int mn = min(c - 1, d - 1);
int ans = (c - 1) * (d - 1);
for (int i = 2; i <= mn; i++)
if (check(i))
{
//cout << i << " " << nr(i) << "\n";
if (!(nr(i) & 1))
ans += 1LL * ((c - 1) / i) * ((d - 1) / i);
else
ans -= 1LL * ((c - 1) / i) * ((d - 1) / i);
}
cout << ans;
}