Cod sursa(job #349190)

Utilizator FlorianFlorian Marcu Florian Data 18 septembrie 2009 15:21:42
Problema Mins Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
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;
}