Cod sursa(job #172448)

Utilizator codrinCodrin LACHE codrin Data 6 aprilie 2008 14:06:16
Problema Fractii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include<iostream>
#include<conio.h>
using namespace std;

long a[20];
int st[20];

long nrelem(long n, long a[20], int m)
{
	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;
	long long s=0L;
	for(int i=1;i<=n;i++)
		s+=fracnum(i,n);
	g<<s;
	f.close();
	g.close();
	return 0;
}