Pagini recente » Statistici JamesHr (hr.james1526) | Istoria paginii utilizator/cnitv.petrescu.buliga.popescu | Statistici Theodor Alexandru (theross) | Cod sursa (job #115764) | Cod sursa (job #476069)
Cod sursa(job #476069)
#include<cstdio>
int tot,x,y,n,pr[10],sol[10],rez[1<<20],nr[1<<20];
void read()
{
freopen("mins.in","r",stdin);
freopen("mins.out","w",stdout);
scanf("%d%d",&x,&y);
}
void calc(int a)
{
int nrt=1,q=0;
for(int i=1;i<=n;i++)
if(sol[i]==1)
nrt*=pr[i], q++;
if(q%2==0 && q)
tot-=(a/nrt);
else if(q) tot+=(a/nrt);
}
void back(int poz,int a)
{
if(poz>n)
{
calc(a);
return;
}
sol[poz]=0;
back(poz+1,a);
sol[poz]=1;
back(poz+1,a);
}
void dfp(int x)
{
for(int i=2;i*i<=x;i++)
if(x%i==0)
{
pr[++n]=i;
x/=i;
}
if(x>1)
pr[++n]=x;
}
void reset()
{
tot=n=0;
}
int calc(int a,int b)
{
reset();
dfp(b);
back(1,a);
return a-tot;
}
void init()
{
for(int i=1;i<=x;i++)
nr[i]=1;
}
void solve()
{
init();
rez[1]=0;
for(int i=2;i<x;i++)
{
if(nr[i]==1)
for(int j=i;j<=x;j+=i)
nr[j]*=i;
if(nr[i]==i)
rez[i]=calc(x,i);
else rez[i]=rez[nr[i]];
}
int rasp=0;
for(int i=1;i<=x;i++)
rasp+=rez[i];
printf("%d",rasp);
}
int main()
{
read();
solve();
return 0;
}