Pagini recente » Cod sursa (job #2729396) | Cod sursa (job #534503) | Cod sursa (job #2342674) | Cod sursa (job #2966534) | Cod sursa (job #928748)
Cod sursa(job #928748)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int MV=1000000;
char c[1000100];
int f[1000100];
void ciur()
{
for(int i=1;i<=MV;i++)
f[i]=i;
for(int d=2;d*d<=MV;d+=2)
{
if(!c[d])
{
f[d]=d;
for(int i=d+d;i<=MV;i+=d)
{
c[i]=1;
f[i]=d;
}
}
if(d==2)
d--;
}
}
vector <int> desc(int a)
{
vector<int>V;
while(a!=1)
{
V.push_back(f[a]);
int fact=f[a];
while(a%fact==0)
a/=fact;
}
return V;
}
int pinex(int a,int b)
{
vector<int>v=desc(b);
if(b==1)
return a;
int n=v.size();
int sol=0;
for(int i=1;i<(1<<n);i++)
{
int biti=0;
int prod=1;
for(int b=0;(1<<b)<=i;b++)
if(i&(1<<b))
{
biti++;
prod*=v[b];
}
if(biti%2)
sol+=a/prod;
else
sol-=a/prod;
}
return a-sol;
}
int main()
{
freopen("mins.in","r",stdin);
freopen("mins.out","w",stdout);
int n,m;
scanf("%d%d",&m,&n);
MV=max(n,m);
ciur();
long long sol=0;
for(int i=1;i<n;i++)
sol+=pinex(m-1,i);
printf("%lld",sol);
return 0;
}