Cod sursa(job #49542)

Utilizator swift90Ionut Bogdanescu swift90 Data 5 aprilie 2007 23:16:34
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<stdio.h>
int nr[1000020],prim[90000];
int main(){
	FILE*in=fopen("fractii.in","r");
	FILE*out=fopen("fractii.out","w");
	int n,i,j,pr,m,i1,k,p,u,mij;
	fscanf(in,"%d",&n);
	if(n==1){
		fprintf(out,"1\n");
		return 0;
	}
	if(n==2){
		fprintf(out,"3\n");
		return 0;
	}
	
	i=4;
	while(i<=n+20){
		nr[i]=1;
		i=i+2;
	}
	for(i=3;i<=n+20;i=i+2){
		pr=1;
		if(nr[i]==0){
			j=i+i;
			while(j<=n+20){
				nr[j]=1;
				j=j+i;
			}
		}
	}
	
	prim[0]=2;
	j=1;
	for(i=3;i<=n+20;i=i+2){
		if(nr[i]==0){
			prim[j]=i;
			j++;
		}
	}
	
	long long s=0;
	m=0;
	k=0;
	for(i=2;i<=n;i++){
		if(i<prim[m]){
			j=0;
			pr=i;
			i1=i;
			while((prim[j]*prim[j]<=i)&&(i1>1)){
				if(i%prim[j]==0){
					pr=(pr/prim[j])*(prim[j]-1);
					while(i1%prim[j]==0)
						i1=i1/prim[j];
					if(i1>1){
						p=1;
						u=m;
						while(p<u){
							mij=(p+u)/2;
							if(i1<=prim[mij])
								u=mij;
							else
								p=mij+1;
						}
						if(i1==prim[p]){
							pr=(pr/prim[p])*(prim[p]-1);
							i1=i1/prim[p];
						}
					}
				}
				j++;
			}
			s=s+pr;
		}
		if(i==prim[m]){
			s=s+prim[m]-1;
			m++;
		}
	}
	
	s=1+2*s;
	fprintf(out,"%lld\n",s);
	
	return 0;
}