Cod sursa(job #476028)

Utilizator unknownliviuMaria Liviu Valentin unknownliviu Data 9 august 2010 16:24:47
Problema Mins Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<fstream>
using namespace std;
ifstream in("mins.in");
ofstream out("mins.out");
bool ciur[1<<10];
int nrprm[10000],l;//vector cu nr prime
void primi()
{
	for(int i=2;i*i<=(1<<10);i++)
		if(!ciur[i])
			for(int j=i*i;j<=(1<<10);j+=i)
				ciur[j]=true;
	ciur[1]=true;
	for(int i=2;i<=(1<<10);i++)
		if(!ciur[i])
		{
			nrprm[++l]=i;
		}
}
int d[16],k;
bool f_primi(int x)
{
	int i;
	for(i=1;nrprm[i]*nrprm[i]<=x;i++)
		if(x%nrprm[i]==0)
		{
			d[++k]=nrprm[i];
			x/=nrprm[i];
			if(x%nrprm[i]==0)
				return false;
		}
	if(x!=1)
		d[++k]=x;
	return true;
}
bool sol[16];
int prod[1<<15],nr;
void prelucrare()
{

	int q=0,sum=1;
	for(int i=1;i<=k;i++)
		if(sol[i])
		{
			//out<<i<<" ";
			q++;
			sum*=d[i];
		}
	if(q%2)
		sum*=-1;
	prod[++nr]=sum;
	//out<<"prod="<<prod[nr]<<"\n";
}
void bkt(int p)
{
	if(p>k)
	{
		prelucrare();
		return;
	}
	sol[p]=0;
	bkt(p+1);
	sol[p]=1;
	bkt(p+1);
}
long long suma(long long x)
{
	long long s=0;
	for(int i=1;i<=nr;i++)
		s+=(x-1)/prod[i];
	return s;
}
void reset()
{
	k=0;
	nr=0;
}
int main()
{
	primi();
	int x,y;
	long long sumaa=0;
	in>>x>>y;
	sumaa+=y-1;
	for(int i=2;i<x;i++)
	{
		if(!f_primi(i))
        {
            reset();
            continue;
        }
		bkt(1);
		sumaa+=(long long)(x-1)/i*suma(y);
		reset();
	}
	out<<sumaa;
	return 0;
}