Cod sursa(job #352407)

Utilizator FlorianFlorian Marcu Florian Data 1 octombrie 2009 17:36:18
Problema Mins Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 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;
void eratostene()
{
	int i,j;
	N = c;
	if(d < N) N = d;
	for(i=2;i<=N;++i) U[i].ok = 0; 
	for(i=4;i<=N;i+=2)
	{
		U[i].ok = 1;
		U[i].A.push_back(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);
			for(j=2*i; j<=N; j+=i)
			{
				U[j].ok = 1; U[j].A.push_back(i);
			}
		}
	}
}
int phi(int X, int Y) // nr de numere prime cu X mai mici ca Y
{
	int sol = Y, i,j,p,nr;
	int n = U[X].A.size();
	for(i = 1; i<(1<<n); ++i)
	{
		for( p = 1, j = 0, nr = 0; j < n; ++j)
			if((1<<j) & i) { ++nr; p*=U[X].A[j]; }
		if(nr&1) sol -= Y/p;
		else sol += Y/p;
	}
	return sol;
}
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 = 1; i <= min; ++i)
		sol += phi(i,max);
	printf("%llu\n",sol);
	return 0;
}