Cod sursa(job #172462)

Utilizator mihai.ioluMihai Iolu mihai.iolu Data 6 aprilie 2008 15:12:25
Problema Fractii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<iostream>
#include<conio.h>
using namespace std;

long a[20];

long nrelem(long n, long a[20], int m)
{
	long s=0;

	for(long i=1;i<(1<<m);i++)
	{
		long p=1,nr=0, t=i, c;
		for(int j=1;j<=m;j++)
		{
			 c=1 & t;
			 t=t>>1;
			 if(c)
				 p=p*a[j];
			 nr+=c;
		}
		if(nr%2==1)
			s+=n/p;
		else
			s-=n/p;
	}
	return n-s;
	/*int nr=0;
	int p=1,k=1;
	long s=0;
	memset(st,0,sizeof(st));
	while(k)
		if(k==m+1)
		{
			if(nr>0)
			{
				if(nr%2==1)
					s=s+n/p;
				else
					s-=n/p;
			}
			k--;
			if(st[k]==2)
			{
				p/=a[k];
				nr--;
			}
		}
		else
			if(st[k]<2)
			{
				st[k]++;
				if(st[k]==2)
				{
					p*=a[k];
					nr++;
				}
				k++;
			}
			else
			{
				st[k--]=0;
				if(st[k]==2)
				{
					p/=a[k];
					nr--;
				}
			}
	return n-s;*/
}

long fracnum(long x, long n)
{
	long d=2;
	int m=0;
	while(x>1)
	{
		if(x%d==0)
		{
			a[++m]=d;
			while(x%d==0)
				x/=d;
		}
		d++;
	}
	return nrelem(n,a,m);
}

int main()
{
	ifstream f("fractii.in");
	ofstream g("fractii.out");
	long n;
	f>>n;
	//n=1000000;
	long long s=0L;
	for(int i=1;i<=n;i++)
	{
		//if(i%10000==0)
			//cout<<i<<endl;
		s+=fracnum(i,n);
	}
	//cout<<s<<endl;
	g<<s;
	f.close();
	g.close();
	return 0;
}


/*#include<iostream>
using namespace std;

long cmmdc(long a, long b)
{
	long r;
	while(b!=0)
	{
		r=a%b;
		a=b;
		b=r;
	}
	return a;
}

void main()
{
	long n=100000;
	long k=0;
	for(long i=1;i<=n;i++)
	{
		for(long j=1;j<=n;j++)
			if(cmmdc(i,j)==1)
				k++;
		if(i%1000==0)
			cout<<i<<endl;
	}
	cout<<k<<endl;
}*/