Pagini recente » Cod sursa (job #2987189) | Cod sursa (job #2800802) | Cod sursa (job #2153142) | Cod sursa (job #2811328) | Cod sursa (job #2146509)
#define DM 1000001
#define DN 12
#include <bitset>
#include <cstring>
#include <fstream>
using namespace std;
ifstream fi ("mins.in");
ofstream fo ("mins.out");
bitset <DM/2+1> bs;
int a, b, d, prm[DM/2+1], dv[DN], aux, rez, mltm, smn, sol;
int main()
{
//ciur
prm[++prm[0]] = 2;
for (int i = 1; ((i*i) << 1) + (i << 1) < DM; ++i)
if (!bs[i])
for (int j = ((i*i) << 1) + (i << 1); (j << 1) + 1 < DM; j += (i << 1) + 1)
bs[j] = 1;
for (int i = 1; i < DM/2+1; ++i)
if (!bs[i])
prm[++prm[0]] = (i << 1) + 1;
fi >> a >> d;
--a;
--d;
for (int i = 2; i <= d; ++i)
{
rez = 0;
b = i;
//descompunere in factori
for (int j = 1; j <= prm[0] && prm[j]*prm[j] <= b; ++j)
if (b%prm[j] == 0)
{
dv[++dv[0]] = prm[j];
while (b%prm[j] == 0)
b /= prm[j];
}
if (b > 1)
dv[++dv[0]] = b;
//pinex
mltm = (1 << dv[0]) - 1;
for (int j = 1; j <= mltm; ++j)
{
aux = 1;
smn = 0;
for (int k = 0; k < dv[0]; ++k)
if (j&(1 << k))
{
aux *= dv[k+1];
++smn;
}
if (smn&1)
rez += a/aux;
else
rez -= a/aux;
}
sol += a - rez;
memset(dv, 0, sizeof(dv));
}
fo << sol + a;
return 0;
}