Cod sursa(job #81385)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 1 septembrie 2007 18:18:16
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include<stdio.h>
#define N 1000011
int euler[N];
char ciur[N];
void ciurul(int n){
	ciur[0]=ciur[1]=1;
	for(int i=2;i*i<=n;++i)
		if(!ciur[i])
			for(int j=i+i;j<=n;j+=i)
				ciur[j]=1;
}
void proba(int n){
	for(int i=0;i<=n;++i)
		printf("(%d,%d) ",i,(int)ciur[i]);
}
int divizor(int n){
	for(int i=2;i*i<=n;++i)
		if(ciur[i]==0&&n%i==0)
			return i;
	return n;
}
int calcul(int n){
	int s=0,i,x;
	euler[0]=euler[1]=1;
	for(i=2;i<=n;++i)
	{
		if(!ciur[i])
			euler[i]=i-1;
		else{
			x=divizor(i);
			if(i/x%x==0)
				euler[i]=euler[i/x]*x;
			else
				euler[i]=euler[i/x]*(x-1);
		}
		s+=euler[i];
	}
	s*=2;
	return ++s;
}
int main(){
	freopen("fractii.in","r",stdin);
	freopen("fractii.out","w",stdout);
	int n,x;
	scanf("%d",&n);
	ciurul(n);
	//proba(n);
	x=calcul(n);
	printf("%d\n",x);
	fclose(stdin);
	fclose(stdout);
	return 0;
}