Pagini recente » Cod sursa (job #84200) | Cod sursa (job #2206403) | Cod sursa (job #468475) | Cod sursa (job #170901) | Cod sursa (job #349190)
Cod sursa(job #349190)
using namespace std;
#include<cstdio>
#include<vector>
#define MAX_N 1000002
struct Lista
{
bool ok;
vector<int>A;
};
Lista U[MAX_N];
int N, c, d;
int euler[MAX_N];
void eratostene()
{
int i,j;
N = c;
if(d < N) N = d;
for(i=2;i<=N;++i) { euler[i] = i; U[i].ok = 0; }
euler[2]--;
for(i=4;i<=N;i+=2)
{
U[i].ok = 1;
U[i].A.push_back(2);
euler[i] = euler[i] - euler[i]/2;
}
U[2].A.push_back(2);
for(i=3;i<=N; i+=2)
{
if(U[i].ok == 0)
{
U[i].A.push_back(i);
euler[i]--;
for(j=2*i; j<=N; j+=i)
{
U[j].ok = 1; U[j].A.push_back(i);
euler[j] = euler[j] - euler[j]/i;
}
}
}
}
inline int prime(int a, int b)
{
int i;
for(i=0; i < U[a].A.size(); ++i)
if( b % U[a].A[i] == 0) return 0;
return 1;
}
int main()
{
freopen("mins.in","r",stdin);
freopen("mins.out","w",stdout);
scanf("%d%d",&c,&d);
int i,j, min, max;
long long unsigned sol = 0;
min = c-1; if(min > d-1) min = d-1;
max = c-1; if(max < d-1) max = d-1;
eratostene();
for(i = 2; i <= min; ++i)
sol =(long long unsigned) (sol + euler[i]);
sol<<=1;
sol += max - min;
for(i = min+1; i <= max; ++i)
for(j=2; j <= min; ++j)
if(prime(j,i))
++sol;
printf("%llu\n",sol+1);
return 0;
}