Pagini recente » Cod sursa (job #963270) | Monitorul de evaluare | Cod sursa (job #2749334) | Cod sursa (job #259758) | Cod sursa (job #682897)
Cod sursa(job #682897)
#include <cstdio>
#include <bitset>
#define XMax 1000005
#define LL long long
using namespace std;
LL A, B, S;
bitset <XMax> V;
int Primes[XMax], F[XMax];
void Eratosthenes ()
{
Primes[++Primes[0]]=2;
for (int i=3; i<XMax; i+=2)
{
if (!V[i])
{
Primes[++Primes[0]]=i;
if (1LL*i*i>=XMax) continue;
for (int j=i*i; j<XMax; j+=(i+i))
{
V[j]=1;
}
}
}
}
void Decompose ()
{
F[0]=0; LL X=B;
for (int i=1; i<=Primes[0] and X>1; ++i)
{
if (X%Primes[i]==0)
{
F[++F[0]]=Primes[i];
for (; X%Primes[i]==0; X/=Primes[i]);
}
}
if (X>1)
{
F[++F[0]]=X;
}
}
void Pinex ()
{
for (int Conf=1; Conf<(1<<F[0]); ++Conf)
{
int Sign=-1; LL X=1;
for (int i=0; i<F[0]; ++i)
{
if (Conf&(1<<i))
{
Sign=-Sign;
X*=F[i+1];
}
}
S+=(Sign*(A/X)*(B/X));
}
S=A*B-S;
}
void Solve ()
{
Eratosthenes ();
Decompose ();
Pinex ();
}
void Read ()
{
freopen ("mins.in", "r", stdin);
scanf ("%lld %lld", &A, &B);
--A, --B;
}
void Print ()
{
freopen ("mins.out", "w", stdout);
printf ("%lld\n", S);
}
int main()
{
Read ();
Solve ();
Print ();
return 0;
}