Pagini recente » Cod sursa (job #2895785) | Cod sursa (job #795255) | Cod sursa (job #2886933) | Cod sursa (job #3000054) | Cod sursa (job #3250379)
#include <fstream>
#define NMAX 1000001
using namespace std;
ifstream f("mins.in");
ofstream g("mins.out");
long long c,d,mn,mx,rez,i,j,k,fact,p,x,m,s,nrc,nrp,v[NMAX],prim[NMAX];
bool ciur[NMAX];
int main()
{
f>>c>>d;
c--; d--;
mn=min(c,d); mx=max(c,d);
// ciurul lui Eratostene
for(i=2;i<=mn;i++)
if(ciur[i]==0)
{
prim[++nrp]=i;
for(int j = i + i; j < NMAX; j += i)
ciur[j] = 1;
}
rez=mx; // toate numerele sunt prime cu 1
for(k=2;k<=mn;k++)
{
// se construieste vectorul cu factorii primi ai lui k (v cu m elem)
x=k;
m=0;
i=1;
while (x>1)
{
if(x%prim[i]==0) v[++m]=prim[i];
while(x%prim[i]==0) x=x/prim[i];
i++;
if(prim[i]*prim[i]>x) fact=x;
}
s=mx; // s=nr. de numere prime cu i care sunt <= mx (scad din mx numerele neprime cu i)
for(i=1; i < (1LL << m); i++)
{
nrc = 0; // numarul de elemente din submultimea curenta
p = 1; // produsul elementelor din submultimea curenta
for(j = 0;j < m; j++)
if(i & (1LL << j))
{
nrc++;
p = p * v[j + 1];
}
if(nrc % 2 == 1) s = s - mx / p;
else s = s + mx / p;
}
rez+=s;
}
g<<rez<<'\n';
return 0;
}