Cod sursa(job #32715)

Utilizator swift90Ionut Bogdanescu swift90 Data 18 martie 2007 13:19:37
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<stdio.h>
#include<math.h>
#include<string.h>
int nr[1000002],num[1000002],prim[100000];
int main(){
	FILE*in=fopen("fractii.in","r");
	FILE*out=fopen("fractii.out","w");
	int n,i,j,pr,a;
	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){
		nr[i]=1;
		i=i+2;
	}
	for(i=3;i<=n+10;i=i+2){
		pr=1;
		if(nr[i]==0){
			for(j=3;((j*j<=i)&&(pr));j=j+2){
				if(i%j==0)
					pr=0;
			}
			if(pr){
				j=i+i;
				while(j<=n){
					nr[j]=1;
					j=j+i;
				}
			}
		}
	}
	
	prim[0]=2;
	j=1;
	for(i=3;i<=n+10;i=i+2){
		if(nr[i]==0){
			prim[j]=i;
			j++;
		}
	}
	i=0;
	
	long long s;
	int p=0,put;
	put=2;
	while(put<=n){
		num[put]=1;
		p++;
		put=put*2;
	}
	if(n%2==0)
		s=n+p*n/2;
	if(n%2==1)
		s=n+p*(n/2+1);
	
	for(i=3;i<=n;i++){
		memset(nr,0,(n+1)*4);
		pr=1;
		j=1;
		p=0;
		put=i;
		if(num[i]==0){
			while(prim[j]<=i){
				if(i%prim[j]==0){
					a=prim[j];
					while(a<=n){
						nr[a]=1;
						a=a+prim[j];
					}
					pr=0;
				}
				j++;
			}
			while(put<=n){
				num[put]=1;
				p++;
				put=put*i;
			}
			if(i%2==1){
				for(a=1;a<=n;a++){
					if(nr[a]==0)
						s=s+p;
				}
			}
			if(i%2==0){
				for(a=1;a<=n;a=a+2){
					if(nr[a]==0)
						s=s+p;
				}
			}
		}
	}
	fprintf(out,"%d\n",s);
	
	fclose(in);
	fclose(out);
	return 0;
}