Pagini recente » Cod sursa (job #1633424) | Cod sursa (job #2592051) | Cod sursa (job #1674141) | Cod sursa (job #3139963) | Cod sursa (job #476099)
Cod sursa(job #476099)
#include<cstdio>
#include<stdlib.h>
int a,b,tot,x,y,n,pr[10],sol[10],rez[1<<20],nr[1<<20],*v[1<<20];
bool prim[1<<20]={true};
short int lung[1<<20];
void read()
{
freopen("mins.in","r",stdin);
freopen("mins.out","w",stdout);
scanf("%d%d",&x,&y);
}
void add()
{
int nrt=1,q=0;
for(int i=0;i<=n;i++)
if(sol[i]==1)
nrt*=v[b][i], q++;
if(q%2==0 && q)
tot-=(a/nrt);
else if(q) tot+=(a/nrt);
}
void back(int poz)
{
if(poz>n)
{
add();
return;
}
sol[poz]=0;
back(poz+1);
sol[poz]=1;
back(poz+1);
}
int calc()
{
n=lung[b]-1;
tot=0;
back(0);
return a-tot;
}
void init()
{
for(int i=1;i<x;i++)
nr[i]=1;
}
void ciur()
{
for(int i=0;i<(1<<20);i++)
prim[i]=true;
prim[1]=false;
for(int i=2;i<(1<<20);i++)
if(prim[i] && (long long)i*i<(1<<20))
{
for(int j=i*i;j<(1<<20);j+=i)
prim[j]=false;
}
}
void solve()
{
init();
ciur();
long long rasp=y-1;
for(int i=2;i<x;i++)
if(nr[i]==1)
for(int j=i;j<x;j+=i)
nr[j]*=i, ++lung[j];
for(int i=2;i<x;i++)
{
v[i]=(int *) malloc(lung[i]*sizeof(int));
lung[i]=0;
}
for(int i=2;i<x;i++)
{
if(prim[i])
for(int j=i;j<x;j+=i)
v[j][lung[j]++]=i;
if(nr[i]==i)
{
a=y-1;
b=i;
rasp+=(rez[i]=calc());
}
else rasp+=rez[nr[i]];
}
printf("%lld",rasp);
}
int main()
{
read();
solve();
return 0;
}